34

この質問はだまされているように思えるかもしれませんが、ご容赦ください。関連する投稿 (およびGOFの本) を読んだことを約束します。

すべてを読んだ後でも、Abstract Factory、Factory Method、または Builder をいつ使用するかはまだ明確ではありません。たとえば、ビルダーが最もよく取り組む問題の簡単な例を見た後、最終的には沈み込むと思います。たとえば、抽象的なファクトリを使用するのは明らかにばかげています。

明確に 1 つのパターンを使用し、他のパターンを使用しない簡単な例を挙げていただけますか?

例が単純すぎると意見の問題になる可能性があることは理解していますが、できる人がいるなら、その人がSOにいることを願っています。

ありがとう。

4

6 に答える 6

55

ビルダーは、複雑なオブジェクトを構築するのに役立ちます。例として、最終的な文字列を 1 つずつ作成するStringBuilderクラス ( JavaC# ) があります。より良い例は、URI の構築に役立つ SpringのUriComponentsBuilderです。

ファクトリ メソッドは、(ビルダーとは対照的に) ワン ショットで完全なオブジェクトを提供します。基本クラスは、インターフェイス (またはスーパー クラス) 参照を返す単一の抽象メソッドを定義し、オブジェクトの具体的な作成をサブクラスに任せます。

抽象ファクトリは、さまざまな関連オブジェクトを作成するためのインターフェイス (または抽象クラス) です。(.NET での) 良い例はDbProviderFactory、具体的な実装に応じて、特定のデータベース プロバイダー (oracle、sql サーバーなど) に関連するオブジェクト (接続、コマンドなど) を作成するクラスです。

于 2010-09-10T18:36:15.667 に答える
9

ビルダー

// 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 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 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
...
于 2010-09-10T19:16:22.543 に答える
2

Abstract Factory、Factory Method、Builder : これらのパターンはすべて作成パターンであり、オブジェクト作成メカニズムを扱う設計パターンであり、状況に適した方法でオブジェクトを作成しようとします。

工場方式:

  1. オブジェクトを作成するためのインターフェースを定義しますが、インスタンス化するクラスはサブクラスに決定させます
  2. 作成ロジックをクライアントに公開せずにオブジェクトを作成し、共通のインターフェイス (または抽象クラス) を使用して新しく作成されたオブジェクトを参照します。
  3. アプリケーション固有のクラスをコードにバインドする必要をなくすことで、疎結合を提供します。コードはインターフェイスまたは抽象クラスとのみ対話します
  4. 目的を達成するために継承またはサブクラス化を使用する場合があります

    キーノート: インターフェイスとこれらのインターフェイスの特定の実装を作成します。Factory メソッドでは、条件に応じて、共通インターフェイスの具体的な実装が得られます。

抽象工場:

  1. 具象クラスを指定せずに、関連オブジェクトまたは依存オブジェクトのファミリを作成するためのインターフェイスを提供する
  2. カプセル化する階層: 多くの可能な「プラットフォーム」`、および一連の「製品」の構築
  3. 抽象ファクトリ クラスは多くの場合、ファクトリ メソッドで実装されますが、プロトタイプを使用して実装することもできます。

ビルダー:

  1. Builder パターンは、単純なオブジェクトを使用し、段階的なアプローチを使用して複雑なオブジェクトを構築します
  2. このシナリオでのファクトリ メソッド/アブストラクト ファクトリへの置き換え: クライアント プログラムからファクトリ クラスに渡す引数が多すぎるため、エラーが発生しやすくなります。
  3. 一部のパラメーターは、すべてのパラメーターを強制的に送信する Factory とは異なり、オプションである場合があります。

Java のビルダー デザイン パターンのガイドライン

  1. オブジェクトが Builder によってビルドされるクラス内に、Builder という静的なネストされたクラスを作成します。
  2. Builder クラスには、元のクラスとまったく同じフィールドのセットがあります
  3. Builder クラスは、成分を追加するメソッドを公開します。各メソッドは同じ Builder オブジェクトを返します。ビルダーは、各メソッド呼び出しで強化されます。
  4. Builder.build() メソッドはすべてのビルダー フィールド値を実際のクラスにコピーし、Item クラスのオブジェクトを返します
  5. Item クラス (Builder を作成するクラス) には、build() メソッドからオブジェクトを作成し、部外者がそのコンストラクターにアクセスできないようにするためのプライベート コンストラクターが必要です。

関連記事:

デザイン パターン: ファクトリ vs ファクトリ メソッド vs 抽象ファクトリ

ビルダーを別のクラスに保持する (流暢なインターフェース)

便利なリンク:

ソースメイキングのデザインパターン

于 2016-02-20T11:02:01.790 に答える
0
  • ファクトリメソッドパターン-複雑なオブジェクトのファミリを構築する場合。
  • オブジェクトビルダーパターン-ユーザーがカスタム実装をフレームワークにプラグインできるようにする場合

詳細については、次のURLをご覧ください。

http://xeon2k.wordpress.com

于 2010-11-27T05:42:56.193 に答える
0

Abstract Factory は、テスト駆動型開発とカップリングの削減に特に役立ちます。

たとえば、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 ...
    }
}

このように、依存関係の挿入を使用して、運用コードの既定の実装を挿入し、ファクトリとそれが作成するオブジェクトを簡単にモックできます。

于 2010-09-10T18:56:26.130 に答える
0

抽象ファクトリ パターンは、(ファクトリの) サブクラス化を使用して、他のオブジェクト(非ファクトリ) を生成します。また、Abstract Factory は、生成されたオブジェクトが並列階層に属することも想定しています (たとえば、プラットフォームの独立性を処理するために、プラットフォームごとに 1 つの階層)。

Builder パターンはサブクラス化を使用して「出力」を生成しますが、これは必ずしもオブジェクトではありません。GOF の例では、Builder がテキスト出力 (マークアップまたはその他) を生成します。

Factory Method パターンは、他の 2 つのパターンとは異なり、「作成者」を抽象的な実装と具体的な実装に分割します(したがって、フレームワークの実装に属することに重点が置かれます)。Abstract Factory と同様に、実際のオブジェクトの作成を扱います。

3 つすべてがサブクラス化を使用しているため、非常によく似ています。それらすべての優れた品質であるサブクラス化は、微妙な違い (上で概説したもの) を隠しているため、多くの人は違いを見るのが困難です。

于 2010-09-10T18:45:57.203 に答える