Frage

Es kann scheinen, als ob diese Frage ist eine Betrogene ist, aber denken Sie bitte mit mir - ich verspreche, ich habe die damit verbundenen Beiträge lesen (und die GOF Buch ).

Nach allem, was ich gelesen habe, habe ich es immer noch nicht klar, wann eine abstrakte Fabrik zu verwenden, eine Factory-Methode oder einen Builder. Ich glaube, es wird schließlich in sinken, nachdem ich ein einfaches Beispiel für ein Problem finden, die am besten durch genähert wird, sagen wir, ein builder , und es wäre zu verwenden klar albern, sagen wir, ein abstrakte Fabrik .

Können Sie ein einfaches Beispiel, wo man eindeutig ein Muster verwenden würde und nicht die anderen?

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

Danke.

War es hilfreich?

Lösung

Ein Builder hilft Ihnen, ein komplexes Objekt zu konstruieren. Ein Beispiel ist die StringBuilder Klasse ( Java , C # ), die die endgültige Zeichenfolge Stück baut Stück. Ein besseres Beispiel ist die UriComponentsBuilder im Frühjahr, mit dem Sie bauen eine URI hilft.

Eine Factory-Methode gibt Ihnen ein komplettes Objekt in einem Schuss (wie zum Baumeister gegen). Eine Basisklasse definiert eine einzelne abstrakte Methode, dass eine Schnittstelle zurückkehrt (oder Superklasse) Referenz, und verzögert die konkrete Erzeugung des Objekts zu Subklassen.

Ein abstraktes Werk ist eine Schnittstelle (oder eine abstrakte Klasse) viele verschiedenen verwandte Objekte zu erstellen. Ein gutes Beispiel (in .NET) ist der DbProviderFactory Klasse, die zugehörigen Objekte (Verbindungen, Befehle, ...) erstellen dient zu einem bestimmten Datenbank-Provider (oracle, sQL Server, ...) je nach ihrer konkreten Umsetzung.

Andere Tipps

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();
}

Factory-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
...

Abstract Factory, Fabrik-Methode, Builder : Alle diese Muster sind creational Muster, das sind Entwurfsmuster, die sich mit der Objekterstellung Mechanismen , versuchen Objekte in einer Art und Weise zu erstellen geeignet für die Situation.

Factory-Methode:

  1. Es definiert eine Schnittstelle zum Erstellen eines Objekts , aber wir Subklassen entscheiden, welche Klasse instanziiert werden
  2. Wir erstellen ein Objekt ohne Freilegung der Erzeugungslogik auf den Client und auf neu erstellte Objekt beziehen eine gemeinsame Schnittstelle (oder eine abstrakte Klassen)
  3. Stellt lose Kopplung durch die Notwendigkeit zu binden anwendungsspezifische Klassen in den Code zu beseitigen . Code interagiert nur mit Schnittstelle oder eine abstrakte Klasse
  4. Es kann mit Vererbung oder Unter classing den Zweck erreichen

    Key note: Sie erhalten eine Schnittstelle & spezifische Implementierung dieser Schnittstellen erstellen. In der Fabrik Verfahren, je nach Zustand, werden Sie konkrete Umsetzung der gemeinsamen Schnittstelle erhalten.

Abstract Factory:

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

Builder:

  1. Builder Muster baut ein komplexes Objekt einfache Objekte verwendet und einen Schritt für Schritt-Ansatz mit
  2. Ersatz-to Factory-Methode / Abstract Factory in diesem Szenario : Zu viele Argumente von Client-Programm auf die Factory-Klasse zu übergeben, die fehleranfällig sein kann
  3. Einige der Parameter können optional anders als in der Fabrik sein, die Kräfte alle Parameter senden

Richtlinien für die Builder-Entwurfsmuster in Java

  1. Erstellen Sie eine statische verschachtelte Klasse namens Builder in der Klasse, deren Objekt gebaut werden durch Builder
  2. Builder-Klasse wird genau denselben Satz von Feldern haben als ursprüngliche Klasse
  3. Builder-Klasse wird Verfahren aussetzen für Zutaten hinzugefügt . Jede Methode wird wieder gleiches Builder-Objekt. Builder wird mit jedem Methodenaufruf angereichert werden.
  4. Builder.build () -Methode werden alle Builder Feldwerte in tatsächliche Klasse und Rückgabeobjekt der Item-Klasse kopieren
  5. Item-Klasse (Klasse, für die wir Builder erstellen) sollte private Konstruktor hat die Aufgabe, aus build () Methode zu schaffen und verhindert, dass Außenstehende den Konstruktor zugreifen zu können.

Related posts:

Design Patterns: Factory-vs-Fabrik-Methode vs Abstract Factory

Keeping builder in separater Klasse (Fluent Interface)

Nützliche Links:

sourcemaking Design-Muster

Die Abstrakte Fabrik Anwendungen Subklassen (Fabriken) zu produzieren andere Objekte (Nicht-Fabriken). Abstract Factory auch sieht vor, dass die parallelen, gehören in Hierarchien erzeugten Objekten (z.B. zu hand Plattform independance, eine Hierarchie für jede Plattform).

Die Verwendungen Builder Muster Subklassen „Ausgang“ zu produzieren - das ist nicht unbedingt Objekte bei allen . Das GOF Beispiel hat die Builder Herstellung Textausgabe (Markup oder auf andere Weise).

Das Factory Method-Muster, im Gegensatz zu den beiden anderen, teilt der „Schöpfer“ in eine abstrakte und konkrete Umsetzung (also die Betonung auf sie zu einer Framework-Implementierung gehören). Wie Abstract Factory, es befasst sich mit den tatsächlichen Objekten zu machen.

Alle drei sind sehr ähnlich, weil sie alle nutzen Subklassifizieren. Es ist die Subclassing, dass die hervorragende Qualität von ihnen ist alles, was die feinen Unterschiede verbirgt (oben skizzierte) und damit viele Menschen Schwierigkeiten haben, die Unterschiede zu sehen.

Abstract Factory ist besonders hilfreich für Testgetriebene Entwicklung und die Verringerung 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 erstellt es.

  • Factory Method-Muster -. Wenn Sie wollen bauen Familie von komplexen Objekten
  • Object Builder-Muster - Wenn Sie möchten Benutzer ermöglichen, Plugin ihre individuelle Implementierung in Ihrem Rahmen

Bitte besuchen Sie die folgende URL, um weitere Informationen.

http://xeon2k.wordpress.com

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top