Ursprünglich im Buch „Design Patterns“ wird in vielen Entwurfsmustern die Verwendung einer losen Kopplung empfohlen. Um dieses Konzept zu verstehen, ist es am besten, über die beschwerliche Reise zu sprechen, die viele Entwickler bei der Arbeit an großen Systemen durchlaufen. Wenn Sie einen Teil des Codes ändern, können Probleme auftreten und es kann zu kaskadierenden Unterbrechungen in anderen Teilen des Systems kommen – Teile, von denen Sie früher dachten, dass sie überhaupt nichts miteinander zu tun hätten.
Das Problem ist die enge Kopplung. Funktionen und Klassen in einem Teil des Systems hängen stark vom Verhalten und der Struktur von Funktionen und Klassen in anderen Teilen des Systems ab. Sie möchten eine Reihe von Mustern, die es diesen Klassen ermöglichen, miteinander zu kommunizieren, Sie möchten sie jedoch nicht eng miteinander verknüpfen, um eine gegenseitige Verzahnung zu vermeiden.
In großen Systemen hängt viel Code von einigen wenigen Schlüsselklassen ab. Wenn diese Klassen geändert werden müssen, kann es zu Schwierigkeiten kommen. Angenommen, Sie haben eine User-Klasse, die aus einer Datei liest. Sie möchten es in eine andere Klasse ändern, die aus der Datenbank liest, Ihr gesamter Code verweist jedoch auf die ursprüngliche Klasse, die aus der Datei liest. Zu diesem Zeitpunkt ist es sehr praktisch, den Werksmodus zu verwenden.
Factory Pattern ist eine Klasse mit bestimmten Methoden, die Objekte für Sie erstellen. Sie können eine Factory-Klasse verwenden, um Objekte zu erstellen, ohne new direkt zu verwenden. Wenn Sie auf diese Weise den Typ des erstellten Objekts ändern möchten, müssen Sie nur die Fabrik ändern. Der gesamte Code, der diese Fabrik verwendet, wird automatisch geändert.
Beispiel 1: Zeigen Sie eine Spalte der Factory-Klasse an. Die Serverseite der Gleichung besteht aus zwei Teilen: einer Datenbank und einer Reihe von PHP-Seiten, die es Ihnen ermöglichen, Feedback hinzuzufügen, eine Liste mit Feedback anzufordern und Artikel zu einem bestimmten Feedback zu erhalten.
interface IUser { function getName(); } class User implements IUser { public function __construct( $id ) { } public function getName() { return "Jack"; } } class UserFactory { public static function Create( $id ) { return new User( $id ); } } $uo = UserFactory::Create( 1 ); echo( $uo->getName()."\n" ); ?>
Die IUser-Schnittstelle definiert, welche Operationen ein Benutzerobjekt ausführen soll. Die Implementierung von IUser heißt User, und die UserFactory-Factory-Klasse erstellt IUser-Objekte. Diese Beziehung kann durch UML in Abbildung 1 dargestellt werden.
Abbildung 1. Factory-Klasse und die zugehörige IUser-Schnittstelle und Benutzerklasse
Wenn Sie diesen Code in der Befehlszeile mit dem PHP-Interpreter ausführen, werden Sie dies tun get Die folgenden Ergebnisse:
% php factory1.php Jack %
Der Testcode fordert das Benutzerobjekt von der Factory an und gibt das Ergebnis der getName-Methode aus.
Es gibt eine Variante des Fabrikmusters, die Fabrikmethoden verwendet. Diese öffentlichen statischen Methoden in einer Klasse erstellen Objekte dieses Typs. Diese Methode ist nützlich, wenn es wichtig ist, Objekte dieses Typs zu erstellen. Angenommen, Sie müssen zunächst ein Objekt erstellen und dann eine Reihe von Eigenschaften festlegen. Diese Version des Factory-Musters kapselt den Prozess an einem einzigen Ort, sodass Sie keinen komplexen Initialisierungscode kopieren und in die gesamte Codebasis einfügen müssen.
Beispiel 2 zeigt ein Beispiel für die Verwendung von Factory-Methoden.
interface IUser { function getName(); } class User implements IUser { public static function Load( $id ) { return new User( $id ); } public static function Create( ) { return new User( null ); } public function __construct( $id ) { } public function getName() { return "Jack"; } } $uo = User::Load( 1 ); echo( $uo->getName()."\n" ); ?>
Dieser Code ist viel einfacher. Es gibt nur eine Schnittstelle IUser und eine Benutzerklasse, die diese Schnittstelle implementiert. Die User-Klasse verfügt über zwei statische Methoden zum Erstellen von Objekten. Diese Beziehung kann durch UML in Abbildung 2 dargestellt werden.
Abbildung 2. IBenutzeroberfläche und Benutzerklasse mit Factory-Methode
Das Ausführen des Skripts in der Befehlszeile führt zu denselben Ergebnissen wie Listing 1, wie unten gezeigt :
% php factory2.php Jack %
Wie oben erwähnt, können solche Modi in kleineren Umgebungen manchmal übertrieben wirken. Es ist jedoch am besten, diese solide Form der Codierung zu erlernen, die Sie auf Projekte jeder Größe anwenden können.
Weitere Artikel zu PHP Design Pattern Talk Factory Pattern finden Sie unter PHP Chinesische Website!