8

In Karl Seguins Foundations of Programming gibt es einen kleinen Abschnitt über die Verwendung des Werksmusters. Er schließt die Passage mit der Aussage "Sie können die gleiche Funktionalität mit Konstruktorüberladung erreichen", gibt aber nicht an wann oder warum?Wann ist es sinnvoller, ein Factory-Muster anstelle eines überladenen Konstruktors zu verwenden, um ein Objekt zu instanziieren?

Wann ist es also sinnvoller, ein Factory-Muster anstelle eines überladenen Konstruktors zu verwenden, um ein Objekt zu instanziieren?

+1

In Karls Verteidigung sagt er, dass das Fabrikmuster bessere Lesbarkeit bietet, aber er verwendet seinen "Bauch" und "Geschmack" als die bestimmenden Faktoren. – JaredCacurak

Antwort

4

Wenn Sie loseren Kopplung haben wollen dann die Fabrik mehr Sinn macht, wie Sie können dann nur die Autofabrik aufrufen, übergeben in der SUV-ENUM und die richtige Klasse zurückgegeben. Ihrer Anwendung ist es egal, welche Klasse tatsächlich zurückgegeben wurde, solange sie Ihren Anforderungen entspricht.

+0

Ein Objekt, das eine Factory als Argument akzeptiert, ist auch für den Aufruf der Erstellungsmethode verantwortlich. – JaredCacurak

2

Ich benutze eine Fabrik, wenn ich möchte, dass die Fabrik eine von mehreren möglichen Unterklassen erstellt (und ich möchte, dass der Aufrufer über die Basisklasse weiß, aber nicht über die Unterklassen).


Auch gelegentlich werde ich statische Methoden der Klasse anstelle eines überladenen Konstruktor, wenn die verschiedenen statischen Methoden nehmen die gleichen Parametertypen (und damit Konstrukteure können nicht auf der Grundlage der Parametertyp allein überlastet werden). Hier ist ein konstruiertes Beispiel:

Department 
{ 
    //static factory methods 
    public static Department createFromBoss(string bossName) { ... } 
    public static Department createFromLocation(string locationName) { ... } 
} 
0

Ich habe 1 Situation, in der eine Fabrik nützlich ist. Ich muss einen Videoeffekt instanziieren, um auf einem Video zu laufen. Je nach Art des Videos hat der Videoeffekt eine andere konkrete Klasse.

Wenn ich die konkrete Klasse instanziiere, verliere ich später die Möglichkeit, weitere Videoeffekte hinzuzufügen, ohne den Instanziierungscode zu ändern.

Wenn ich weitere Videoeffekte hinzufügen, muss ich nur die Fabrik ändern, um die richtige Betonklasse zu wählen.

Macht das Sinn?

0

Es kann sein, dass die Factory manchmal Subtypen des zurückgegebenen Typs generiert. Sie können dies nicht mit einem Konstruktor tun, sondern haben die Flexibilität mit einer Fabrik.

4

Wenn Sie Dependency Injection tun, aber Instanzen der Abhängigkeit nach Bedarf innerhalb der abhängigen erstellen müssen, ist eine Option, eine Schnittstelle zu einer Klassenfactory zu injizieren. Die Factory kann eine Schnittstelle oder eine abstrakte Klasse zurückgeben. Dies bietet Flexibilität, Testbarkeit und Entkopplung auf Kosten einer gewissen Komplexität.

+0

In der Tat kann Virtual Construction nicht ohne eine Art Factory/Builder für einige Sprachen (C++) erreicht werden –

1

Ich stimme seiner Aussage nicht zu. Verschiedene Konstruktoren werden verwendet, wenn Sie verschiedene Methoden zum Konstruieren/Initialisieren des Konstruktors verwenden. Das Factory-Muster wird verwendet, wenn aufgrund der Initialisierungskriterien unterschiedliche Objekte erstellt werden müssen.

0

Es ist auch sinnvoller, das Fabrikmuster zu verwenden, um Unterklassen zu verwenden, wie von ChrisW illustriert, wenn Sie Polymorphismus durch Ihre Methoden implementieren möchten.Wenn

Department b = Department.createFromBoss(); 
Department l = Department.createFromLocation(); 

zurückkehren beide verschiedene Unterklassen von Abteilung dann,

b.Close() 

und

l.Close() 

zum Beispiel verschiedene Maßnahmen ergreifen könnte, die Messier würde, wenn Sie und schließen musste versuchen () ein einzelnes Objekt durch Überladen des Konstruktors.