4

この質問が何度も尋ねられたことは知っていますが、質問が重複しているように見えるかもしれませんが、SO、Google、GoF の投稿を理解しようとしましたが、答えが見つかりませんでした...

Factory Method と Builder の違いを理解しています: Factory Method - 特定の基本クラスから派生したオブジェクトを作成し、具体的な実装をクライアントから切り離します。

Builder メソッド - オブジェクト作成の複雑さをクライアントから隠します

インターネットで見つけた例 (依存性注入のための抽象ファクトリ デザイン パターン) が表示されました。これは抽象ファクトリに関するものですが、私の質問には関係ありません。これは、私が見た多くの記事の 1 つにすぎません

//Abstract Factory for Dependency Injection
//Factory interface
public interface Module1ServiceFactory {
 ComponentA getComponentA();
 ComponentB getComponentB();
}

//Concrete factory
public class Module1ServiceFactoryImpl {
 private Module1ServiceFactory instance;

 private Module1ServiceFactoryImpl() {}

 public static synchronized Module1ServiceFactory getInstance() {
  if (null == instance) {
   instance = new Module1ServiceFactoryImpl();
  }

return instance;
 }

*** SUBJECT METHOD ***
 public ComponentA getComponentA() {
  ComponentA componentA = new ComponentAImpl();
  ComponentB componentB = getComponentB();
  componentA.setComponentB(componentB);
  return componentA;
 }

 public ComponentB getComponentB() {
  return new ComponentBImpl();
 }
}

その例でわかることは、ComponentA は、それを構築するために getComponentA() メソッドが使用した複合型です。

  1. では、なぜこれが Builder ではなく Factory と呼ばれるのですか? それとも、Module1ServiceFactoryImpl が Factory AND Builder パターンを実装するということですか?
  2. ソフトウェア アーキテクチャ設計で複数の設計パターンを実装するクラス/オブジェクトを作成することは正しいですか (一般的に使用されますか)?

そして私の英語でごめんなさい:)

4

3 に答える 3

1

Factory パターンは、基本的にインスタンス化の具体的なオブジェクトを (コンストラクターとは異なり)隠し、代わりに作成されたオブジェクトのインターフェイスを強調します。

対照的に、Builder パターンは通常、一部のステップがオプションである場合もある複数ステップのビルド動作を実装するのに役立ちます。コンストラクター (またはファクトリ メソッド) とは異なり、一度に意味的に作成するのではなく、オブジェクトの作成を論理単位に分割することを強調します。

次のサンプルは、違いをもう少し明確に表していると思います。

public class ComponentABuilder {
  private ComponentB componentB;
  private ComponentC componentC;

  public ComponentABuilder BuildComponentB(ComponentB b) {
    this.componentB = b;
  }

  public ComponentABuilder BuildComponentC(ComponentC c) {
    // Added another ComponentC, since just building B would
    // be pointless
    this.componentC = c;
  }

  public ComponentA Build() {
    // Might also be implemented via setters or whatever, the
    // point is that build now returns an object that is fully
    // built according to the steps the consumer performed via
    // the builder's methods, whereas a Factory Method would
    // do all the stuff by theirself.
    return new ComponentA(this.componentB, this.componentC);
  }
}

// Consumer sticks together his very own ComponentA
// in (usually) multiple steps
ComponentA c = new ComponentABuilder()
  .BuildComponentB(new ComponentBImpl()) // step 1
  .BuildComponentB(new ComponentCImpl()) // step 2
  .Build();

// Factory builds their ComponentA according to their
// own internal application, and getInstance is exposed
// as an "atomic" step to the consumer
ComponentA c2 = new ComponentAFactory().getInstance();

Builder サンプルは、それを適用することが理にかなっているかなり特殊なケースです。ただし、異なるアプリケーションにも使用できるはずです。

于 2012-06-19T10:14:10.253 に答える
1

では、なぜこれが Builder ではなく Factory と呼ばれるのですか? それとも、Module1ServiceFactoryImpl が Factory AND Builder パターンを実装するということですか?

それは工場であり、唯一の工場であるため、工場と呼ばれます

*** SUBJECT METHOD ***
 public ComponentA getComponentA() {
  ComponentA componentA = new ComponentAImpl();
  ComponentB componentB = getComponentB();
  componentA.setComponentB(componentB);
  return componentA;
 }

 public ComponentB getComponentB() {
  return new ComponentBImpl();
 }

ここにはビルダーがいません。確かに、これは最も単純なアプローチではありませんが、ビルダー パターンが導入された場合ほど複雑ではありません。これは、JavaBean の方法に似ており、新しく作成されたオブジェクトでセッターを使用します。Builder パターンでは、最後のステップでオブジェクトを作成する必要があります。これにより、オブジェクトを作成するときに、すぐに使用できる状態とまだ準備ができていない状態になることができなくなります。

ソフトウェア アーキテクチャ設計で複数の設計パターンを実装するクラス/オブジェクトを作成することは正しいですか (一般的に使用されますか)?

はい、それは正しく、時々使用されます。それほど一般的ではありません。すべてのパターンがいくらかの複雑さを追加し、複数のパターンが複数の複雑さを追加するためです :) しかし、もちろん、ビルダーとファクトリ (ビルダーには因数分解されるいくつかのパーツが必要です)、facory とビルダー (ファクトリーは create オブジェクトの使用をカプセル化します) を混在させることができます。ビルダー付き)。パターンは連携するのに適しています。MVC は良いサンプルです:

GoF (Gang of Four) は、MVC をデザイン パターンとは呼びませんが、「ユーザー インターフェイスを構築するための一連のクラス」と見なします。彼らの見解では、これは実際には、他の 3 つの古典的な設計パターンである Observer (Pub/Sub)、Strategy、および Composite パターンのバリエーションです。MVC がフレームワークにどのように実装されているかによって、Factory パターンと Decorator パターンも使用される場合があります。

http://addyosmani.com/blog/understanding-mvc-and-mvp-for-javascript-and-backbone-developers/

于 2012-06-19T20:10:48.853 に答える