30

Es mag scheinen, als ob diese Frage ein Betrogener ist, aber bitte ertragen Sie mit mir - ich verspreche, dass ich die verwandten Pfosten gelesen habe (und die GOF book).Abstrakte Fabrik, Fabrik Methode, Erbauer

Nach allem, was ich gelesen habe, habe ich immer noch nicht klar, wann eine abstrakte Fabrik, eine Factory-Methode oder ein Builder zu verwenden ist. Ich glaube, es wird endlich nachgeben, wenn ich ein einfaches Beispiel für ein Problem sehe, das am besten zum Beispiel von einem Erbauer angegangen wird, und es wäre eindeutig albern, eine abstrakte Fabrik zu verwenden.

Können Sie ein einfaches Beispiel angeben, bei dem Sie eindeutig ein Muster verwenden und nicht die anderen?

Ich verstehe, es kann auf eine Frage der Meinung herunterkochen, wenn das Beispiel zu einfach ist, aber ich bin zuversichtlich, dass, wenn jemand kann, diese Person in SO ist.

Danke.

Antwort

50

Ein Builder hilft Ihnen beim Erstellen eines komplexen Objekts. Ein Beispiel ist die StringBuilder Klasse (Java, C#), die die endgültige Saite Stück für Stück baut. Ein besseres Beispiel ist die UriComponentsBuilder in Spring, die Ihnen hilft, eine URI zu erstellen.

Eine Factory-Methode gibt Ihnen ein komplettes Objekt auf einmal (im Gegensatz zum Builder). Eine Basisklasse definiert eine einzelne abstrakte Methode, die einen Verweis auf eine Schnittstelle (oder eine Superklasse) zurückgibt und die konkrete Erstellung des Objekts auf Unterklassen verschiebt.

Eine abstrakte Factory ist eine Schnittstelle (oder abstrakte Klasse), um viele verschiedene verwandte Objekte zu erstellen. Ein gutes Beispiel (in .NET) ist die Klasse DbProviderFactory, die dazu dient, verwandte Objekte (Verbindungen, Befehle, ...) zu einem bestimmten Datenbankprovider (Oracle, SQL Server, ...) zu erstellen, abhängig von der konkreten Implementierung.

+0

Stringbuilder kein Erbauer Implementierung ist. Es ist ein Mythos. – NileshChauhan

+1

@NileshChauhan: Ich bitte um Unterschiede! –

+0

'WebRequest.Create' ist keine GoF-Factory-Methode. Es ist eine statische Fabrikmethode. Sie sind zwei verschiedene Muster. – jaco0646

0

Die Abstrakte Fabrik verwendet Subklassifizieren (Fabriken) andere Objekte (nicht-Fabriken) zu erzeugen. Abstract Factory sieht auch vor, dass die erzeugten Objekte zu parallelen Hierarchien gehören (z. B. zur Handhabung der Plattformunabhängigkeit, einer Hierarchie für jede Plattform).

Das Builder-Muster verwendet Unterklasse, um "Ausgabe" zu erzeugen - das ist nicht notwendigerweise Objekte überhaupt. Im GOF-Beispiel wird vom Builder eine Textausgabe (Markup oder anderes) ausgegeben.

Die Factory-Methode Muster, im Gegensatz zu den anderen beiden, teilt die "Schöpfer" in eine abstrakte und konkrete Implementierung (also die Betonung darauf zu einer Framework-Implementierung gehört). Wie bei der abstrakten Fabrik handelt es sich um die Herstellung von realen Objekten.

Alle drei sind sehr ähnlich, weil sie alle Unterklassen verwenden. Es ist das Unterklassieren, das die hervorragende Qualität von allen ist, die die feinen Unterschiede verbirgt (oben beschrieben) und so viele Leute Schwierigkeiten haben, die Unterschiede zu sehen.

0

Abstract Factory ist besonders hilfreich für die testgetriebene Entwicklung und die Reduzierung der Kopplung.

Zum Beispiel in C#:

public class Worker 
{ 
    public IConsumerFactory Factory { get; set; } 

    private IResource resource; 

    public DoWork() 
    { 
     IConsumer consumer = Factory.CreateConsumer(); 
     consumer.Consume(resource); 
    } 
} 

public interface IConsumerFactory 
{ 
    IConsumer CreateConsumer(); 
} 

public interface IConsumer 
{ 
    void Consume(IResource resource); 
} 

public class DefaultConsumerFactory : IConsumerFactory 
{ 
    public IConsumer CreateConsumer() 
    { 
     return new DefaultConsumer(); 
    } 
} 

public class DefaultConsumer : IConsumer 
{ 
    public void Consume(IResource resource) 
    { 
     ... Do Work ... 
    } 
} 

Auf diese Weise können Sie Dependency Injection verwenden, um die Standardimplementierungen für die Produktion Code zu injizieren, und dann können Sie bequem die Fabrik verspotten und die Objekte, die es schafft.

8

Builder

// Builder encapsulates construction of other object. Building of the object can be done in multiple steps (methods) 
public class ConfigurationBuilder 
{ 
    // Each method adds some configuration part to internally created Configuration object 
    void AddDbConfiguration(...); 
    void AddSmtpConfiguration(...); 
    void AddWebServicesConfiguration(...); 
    void AddWebServerConfiguration(...); 

    // Returns built configuration 
    Configuration GetConfiguration(); 
} 

Fabrik Methode

// Factory method is declared in base class or interface. Subclass defines what type is created by factory method. 
public interface ICacheProvider 
{ 
    ISession CreateCache(); // Don't have to return new instance each time - such decission is part of implementation in derived class. 
} 

public class InMemoryCacheProvider : ICacheProvider 
{ ... } 

public class DbStoredCacheProvider : ICacheProvider 
{ ... } 

// Client code 
ICacheProvider provider = new InMemoryCacheProvider 
ICache cache = provider.CreateCache(); 

Abstract Factory

// Abstract factory defines families of platform classes - you don't need to specify each platform class on the client. 
public interface IDbPlatform 
{ 
    // It basically defines many factory methods for related classes 
    IDbConnection CreateConnection(); 
    IDbCommand CreateCommand(); 
    ... 
} 

// Abstract factory implementation - single class defines whole platform 
public class OraclePlatfrom : IDbPlatform 
{ ... } 

public class MySqlPlatform : IDbPlatform 
{ ... } 

// Client code: 
IDbPlatform platform = new OraclePlatform(); 
IConnection connection = platform.CreateConnection(); // Automatically Oracle related 
... 
0
  • Factory-Method-Muster - Wenn Sie eine Familie komplexer Objekte erstellen möchten.
  • Object Builder-Muster - Wenn Sie möchten Benutzer ermöglichen, ihre individuelle Implementierung in Ihren Rahmen für weitere Details

Bitte besuchen Sie die folgenden URL-Plugin.

http://xeon2k.wordpress.com

1

Ich schrieb neulich einen Artikel mit dem Ziel, die Factory Method-Muster und das Builder-Muster zu vergleichen. Sie können es hier finden: http://www.shenghua.co.uk/factory-method-vs-builder/. Hoffe es kann auch helfen.

Aus eigener Erfahrung fand ich das Head First Design Pattern Buch auch ein wirklich gutes Buch über Design Patterns. Anders als das von Erich Gamma entwickelte Modell ging es an jedes Entwurfsmuster heran, indem es ein Problem aufstellte, das dadurch verursacht wurde, dass Entwurfsmuster nicht verwendet wurden, und dann darauf, wie ein Entwurfsmuster dieses Problem lösen kann. Es war eine sehr angenehme Lektüre für mich. Es machte auch die von Erich Gamma geschriebene viel einfacher zu verstehen, nachdem Sie es gelesen haben.

2

Abstract Factory, Fabrik-Methode, Builder: Alle diese Muster sind creational Muster, die Entwurfsmuster sind, die mit Objekterstellung Mechanismen umgehen, versuchen Objekte in einer Weise geeignet, um die Situation zu schaffen.

Fabrik-Methode:

  1. Es definiert eine Schnittstelle zum Erstellen eines Objekts, aber wir Subklassen entscheiden, welche Klasse
  2. Wir schaffen ohne Freilegung der Schaffung Logik an den Client ein Objekt zu instanziiert und beziehen sich auf neu erstellte Objekt mit einer gemeinsamen Schnittstelle (oder eine abstrakte Klassen)
  3. Bietet lose Kopplung durch die Beseitigung der Notwendigkeit um anwendungsspezifische Klassen in den Code zu binden.Code interagiert nur mit Schnittstelle oder eine abstrakte Klasse
  4. Es Erbschaft oder Unter Klassierung verwenden kann dem Zweck

    Key Note zu erreichen: Sie erhalten eine Schnittstelle & spezifische Implementierung dieser Schnittstellen erstellen. In der Factory-Methode erhalten Sie je nach Bedingung eine konkrete Implementierung der Common Interface.

Abstract Factory:

  1. eine Schnittstelle bereitstellen, für Familien von verwandten oder abhängigen Objekte ohne Angabe ihrer konkreten Klassen
  2. Eine Hierarchie, die kapselt erstellen: viele mögliche „Plattformen "und die Konstruktion einer Reihe von" Produkten "
  3. Abstract Factory-Klassen sind oft mit Factory-Methoden implementiert, aber sie können auch unter Verwendung von Prototype

Builder implementiert werden: Muster ein komplexes Objekt mit einfachen Objekten und mit einem Schritt baut

  1. Builder by step approach
  2. Ersatz für Factory-Methode/Abstract Factory in diesem Szenario: Zu viele Argumente von Client-Programm an die übergeben Factory-Klasse, die fehleranfällig
  3. Einige der Parameter sein könnte optional anders als in der Fabrik, die alle Parameter zu senden zwingt

Richtlinien für die Builder-Entwurfsmuster in Java

  1. Machen Sie eine statische geschachtelte Klasse mit dem Namen Builder in der Klasse, deren Objekt vom Builder erstellt wird
  2. Builder-Klasse wird genau die gleiche Gruppe von Feldern haben als ursprüngliche Klasse
  3. Builder-Klasse wird Methode zum Hinzufügen von Zutaten offen legen. Jede Methode gibt dasselbe Builder-Objekt zurück. Builder wird mit jedem Methodenaufruf angereichert.
  4. Builder.build() -Methode werden alle Builder Feldwerte in tatsächliche Klasse kopieren und das Rück Objekt der Item-Klasse
  5. Item-Klasse (Klasse, für die wir schaffen Builder) privaten Konstruktor haben sollte, seine Aufgabe erstellen aus build() -Methode und verhindert, dass Außenstehende auf seinen Konstruktor zugreifen.

Related posts:

Design Patterns: Factory vs Factory method vs Abstract Factory

Keeping builder in separate class (fluent interface)

Nützliche Links:

sourcemaking Design-Muster