Jetzt können wir die Vererbung verwenden, um die Art und Weise, wie die Klasse erstellt wird, einfach zu ändern und eine andere Gruppe von Klassen einzufügen.
Ein gutes Beispiel könnte diese Benutzerklasse sein:
In dieser Klasse $dataist die Klasse, in der wir unsere Daten speichern. Nehmen wir für diese Klasse an, wir verwenden eine Sitzung, um unsere Daten zu speichern. Die Fabrik würde so aussehen:
Fabriken sind ein Entwurfsmuster, mit dem wir steuern, wie wir Objekte zusammensetzen. Durch die Verwendung korrekter Fabrikmuster können wir die benutzerdefinierten Objekte erstellen, die wir benötigen.
Das war viel Tippen. Jetzt muss ich es irgendwann in mein Wiki stellen.
Tyler Carter
1
Schön und hilfsbereit. Hut ab vor dir Kumpel.
Stefgosselin
1
Was ist der Unterschied / Nutzen Ihres Codes $obj = $factory->build();gegenüber $obj = new whateverClass();? Wo würden Sie in einer anderen Klasse (z. B. classZ), die von den Daten von classA abhängt, in classZ die Factory-Methode verwenden? Sie instanziieren im Wesentlichen immer noch eine Klasse (classZ) innerhalb einer Klasse (classA), was bedeutet, dass keine Tests durchgeführt werden. zB scheint die Fabrik nur eine Menge Code zu sein, die newüber eine Methode ausgeführt werden kann, anstatt nur zu verwenden new.
James
18
Wie eine echte Fabrik schafft sie etwas und gibt es zurück.
Stellen Sie sich so etwas vor
$joe =newJoe();
$joe->say('hello');
oder eine Fabrikmethode
Joe::Factory()->say('hello');
Durch die Implementierung der Factory-Methode wird eine neue Instanz erstellt und zurückgegeben.
Schönes Beispiel, erstaunt mich, wie vielfältig die Implementierungen für dieses Muster sind. Wenn ich statisch aufgerufen werde, gehe ich davon aus, dass man einen Verweis auf die Instanz erhalten kann, um dieselbe Instanz später wiederzuverwenden. dh $ joe = Joe :: Factory () -> say ('Hallo');
Stefgosselin
sicherlich wie bei 5.6 kann man auch machen (neuer Joe ()) -> sagen ('hallo');
Pancho
12
Das Factory-Design-Muster ist sehr gut, wenn Sie mit mehreren Ressourcen arbeiten und eine Abstraktion auf hoher Ebene implementieren möchten.
Lassen Sie uns dies in einen anderen Abschnitt unterteilen.
Angenommen, Sie müssen die Abstraktion implementieren und der Benutzer Ihrer Klasse muss sich nicht darum kümmern, was Sie in der Klassendefinition implementiert haben.
Er / Sie muss sich nur um die Verwendung Ihrer Klassenmethoden kümmern.
MySQLDatabaseConnectionYour mysql select query execute here
In Zukunft haben Sie möglicherweise eine andere Datenbank, dann müssen Sie nicht den gesamten Code ändern, sondern müssen nur den neuen Datenbanktyp übergeben. Anderer Code wird ohne Änderungen ausgeführt.
Factory Design Pattern (Factory Pattern) dient zur losen Kopplung. Wie die Bedeutung von Fabrik, Daten zu einer Fabrik (Daten produzieren) zum Endbenutzer. Auf diese Weise unterbricht die Fabrik die enge Kopplung zwischen Datenquelle und Datenprozess.
Diese Antwort bezieht sich auf einen anderen Beitrag, in dem Daniel White Factory zum Erstellen einer MySQL-Verbindung mithilfe des Factory-Musters verwendet.
Für die MySQL-Verbindung würde ich lieber ein Singleton-Muster verwenden, da Sie dieselbe Verbindung für den Zugriff auf die Datenbank verwenden möchten, ohne eine andere zu erstellen.
Der klassische Ansatz zum Instanziieren eines Objekts lautet:
$Object=newClassName();
PHP kann ein Objekt aus dem Variablennamen mithilfe der folgenden Syntax dynamisch erstellen:
$Object=new $classname;
Dabei enthält die Variable $ classname den Namen der Klasse, die instanziiert werden soll.
Das klassische Objekt-Factoring würde also so aussehen:
function getInstance($classname){if($classname==='Customer'){
$Object=newCustomer();}
elseif($classname==='Product'){
$Object=newProduct();}return $Object;}
und wenn Sie die Funktion getInstance ('Product') aufrufen, erstellt diese Factory ein Product-Objekt und gibt es zurück. Wenn Sie andernfalls die Funktion getInstance ('Customer') aufrufen, erstellt diese Factory ein Objekt vom Typ Customer (erstellt aus der Klasse Customer ()) und gibt es zurück.
Es besteht keine Notwendigkeit mehr dafür, man kann 'Produkt' oder 'Kunde' (genaue Namen vorhandener Klassen) als Wert der Variablen für die dynamische Instanziierung senden:
$classname='Product';
$Object1=new $classname;//this will instantiate new Product()
$classname='Customer';
$Object2=new $classname;//this will instantiate new Customer()
In einfachen Worten, eine Fabrik wie @Pindatjuh gibt ein Objekt zurück.
Was ist der Unterschied zu einem Konstruktor? (das macht das gleiche)
Ein Konstruktor verwendet seine eigene Instanz.
Etwas, das ich möchte, also etwas Fortgeschritteneres und ich möchte das Objekt nicht aufblähen (oder Abhängigkeiten hinzufügen).
Der Konstruktor wird aufgerufen, wenn jede Instanz erstellt wird. Manchmal willst du das nicht.
Angenommen, ich lese jedes Mal, wenn ich ein Objekt der Klasse Account erstelle, eine Datei aus der Datenbank und verwende sie als Vorlage.
Konstruktor verwenden:
classAccount{var $user;var $pwd;var...public __construct(){// here i read from the file// and many other stuff}}
Werkseitig:
classAccount{var $user;var $pwd;var...}classAccountFactory{publicstaticCreate(){
$obj=newAccount();// here we read the file and more stuff.return $obj;}
Antworten:
Eine Fabrik erstellt ein Objekt. Also, wenn Sie bauen wollten
Sie möchten sich nicht darauf verlassen, dass Sie bei jedem Erstellen des Objekts den folgenden Code ausführen müssen
Hier würde die Fabrik ins Spiel kommen. Wir definieren eine Fabrik, die das für uns erledigt:
Jetzt müssen wir nur noch tun
Der eigentliche Vorteil ist, wenn Sie die Klasse ändern möchten. Nehmen wir an, wir wollten eine andere Klasse C bestehen:
oder eine neue Klasse B:
Jetzt können wir die Vererbung verwenden, um die Art und Weise, wie die Klasse erstellt wird, einfach zu ändern und eine andere Gruppe von Klassen einzufügen.
Ein gutes Beispiel könnte diese Benutzerklasse sein:
In dieser Klasse
$data
ist die Klasse, in der wir unsere Daten speichern. Nehmen wir für diese Klasse an, wir verwenden eine Sitzung, um unsere Daten zu speichern. Die Fabrik würde so aussehen:Nehmen wir an, wir möchten stattdessen alle unsere Daten in der Datenbank speichern. Es ist wirklich einfach, sie zu ändern:
Fabriken sind ein Entwurfsmuster, mit dem wir steuern, wie wir Objekte zusammensetzen. Durch die Verwendung korrekter Fabrikmuster können wir die benutzerdefinierten Objekte erstellen, die wir benötigen.
quelle
$obj = $factory->build();
gegenüber$obj = new whateverClass();
? Wo würden Sie in einer anderen Klasse (z. B. classZ), die von den Daten von classA abhängt, in classZ die Factory-Methode verwenden? Sie instanziieren im Wesentlichen immer noch eine Klasse (classZ) innerhalb einer Klasse (classA), was bedeutet, dass keine Tests durchgeführt werden. zB scheint die Fabrik nur eine Menge Code zu sein, dienew
über eine Methode ausgeführt werden kann, anstatt nur zu verwendennew
.Wie eine echte Fabrik schafft sie etwas und gibt es zurück.
Stellen Sie sich so etwas vor
oder eine Fabrikmethode
Durch die Implementierung der Factory-Methode wird eine neue Instanz erstellt und zurückgegeben.
quelle
Das Factory-Design-Muster ist sehr gut, wenn Sie mit mehreren Ressourcen arbeiten und eine Abstraktion auf hoher Ebene implementieren möchten.
Lassen Sie uns dies in einen anderen Abschnitt unterteilen.
Angenommen, Sie müssen die Abstraktion implementieren und der Benutzer Ihrer Klasse muss sich nicht darum kümmern, was Sie in der Klassendefinition implementiert haben.
Er / Sie muss sich nur um die Verwendung Ihrer Klassenmethoden kümmern.
zB Sie haben zwei Datenbanken für Ihr Projekt
Ihre Factory-Klasse kümmert sich um die Erstellung eines Objekts für die Datenbankverbindung.
Der Benutzer muss nur den Namen des Datenbanktyps übergeben
Ausgabe:
In Zukunft haben Sie möglicherweise eine andere Datenbank, dann müssen Sie nicht den gesamten Code ändern, sondern müssen nur den neuen Datenbanktyp übergeben. Anderer Code wird ohne Änderungen ausgeführt.
Ausgabe:
Hoffe das wird helfen.
quelle
Im Allgemeinen produziert eine "Fabrik" etwas: Im Fall der objektorientierten Programmierung produziert ein "Fabrikdesignmuster" Objekte.
Es spielt keine Rolle, ob es sich um PHP, C # oder eine andere objektorientierte Sprache handelt.
quelle
Factory Design Pattern (Factory Pattern) dient zur losen Kopplung. Wie die Bedeutung von Fabrik, Daten zu einer Fabrik (Daten produzieren) zum Endbenutzer. Auf diese Weise unterbricht die Fabrik die enge Kopplung zwischen Datenquelle und Datenprozess.
quelle
Eine Fabrik erzeugt nur ein Objekt oder Objekte.
Möglicherweise haben Sie eine Factory, die eine MySQL-Verbindung herstellt.
http://en.wikipedia.org/wiki/Factory_method_pattern
quelle
Diese Antwort bezieht sich auf einen anderen Beitrag, in dem Daniel White Factory zum Erstellen einer MySQL-Verbindung mithilfe des Factory-Musters verwendet.
Für die MySQL-Verbindung würde ich lieber ein Singleton-Muster verwenden, da Sie dieselbe Verbindung für den Zugriff auf die Datenbank verwenden möchten, ohne eine andere zu erstellen.
quelle
Der klassische Ansatz zum Instanziieren eines Objekts lautet:
PHP kann ein Objekt aus dem Variablennamen mithilfe der folgenden Syntax dynamisch erstellen:
Dabei enthält die Variable $ classname den Namen der Klasse, die instanziiert werden soll.
Das klassische Objekt-Factoring würde also so aussehen:
und wenn Sie die Funktion getInstance ('Product') aufrufen, erstellt diese Factory ein Product-Objekt und gibt es zurück. Wenn Sie andernfalls die Funktion getInstance ('Customer') aufrufen, erstellt diese Factory ein Objekt vom Typ Customer (erstellt aus der Klasse Customer ()) und gibt es zurück.
Es besteht keine Notwendigkeit mehr dafür, man kann 'Produkt' oder 'Kunde' (genaue Namen vorhandener Klassen) als Wert der Variablen für die dynamische Instanziierung senden:
quelle
In einfachen Worten, eine Fabrik wie @Pindatjuh gibt ein Objekt zurück.
Was ist der Unterschied zu einem Konstruktor? (das macht das gleiche)
Der Konstruktor wird aufgerufen, wenn jede Instanz erstellt wird. Manchmal willst du das nicht.
Angenommen, ich lese jedes Mal, wenn ich ein Objekt der Klasse Account erstelle, eine Datei aus der Datenbank und verwende sie als Vorlage.
Konstruktor verwenden:
Werkseitig:
quelle