web-dev-qa-db-ja.com

ファクトリ、抽象ファクトリ、ファクトリメソッド

私はこれらの3つの用語について本当に混乱しています。

私の理解はそれです:

  • ファクトリパターンでは、具体的なファクトリはありません。ファクトリは、パラメータに従って新しいオブジェクトを作成します。

  • abstract Factoryパターンでは、複数の具体的なファクトリがあります。クライアントは、さまざまな具体的な工場を明示的に作成する必要があります。

そうですか?

他の違いは何ですか?

さらに、ファクトリメソッドパターンとは何ですか?ファクトリパターンと同じですか?

42
skydoor

4つの「デザインパターン;再利用可能なオブジェクト指向ソフトウェアの要素」の本には、「AbstractFactory」(別名「VirtualConstructor」)と「FactoryMethod」の2つのエントリが含まれています...「ConcreteFactory」についてはわかりません。私はその言葉を聞いたことがありますが、あまり考えたことはありません。

ファクトリメソッド

「ファクトリメソッド」では、オブジェクトには別のオブジェクトのインスタンス化を担当するメソッドがあります。一般的な例は、JavaScriptドキュメントオブジェクトとHtmlElementオブジェクトの作成です。

var newDiv = document.createElement('div');

ただし、ファクトリメソッドの重要な部分はポリモーフィズムであるため、これは良い例ではありません。 documentを拡張して、別のcreateElementを定義する別のクラスを定義できれば、これは主要なファクトリメソッドマテリアルになります。

抽象ファクトリ

抽象ファクトリは、具体的なクラスを指定せずに、「関連オブジェクトまたは依存オブジェクトのファミリを作成するためのインターフェイスを提供することを目的としています。

典型的な本の真っ直ぐな例はウィジェットファクトリです。 GoFが公開された当時、クロスプラットフォームのGUI開発は少し面倒だったので、抽象ウィジェットファクトリクラスを定義できました。

そのクラスは、メソッドcreateWindowcreateButtoncreateScrollBarなどを持つことができます。次に、SwingウィジェットやAWTなどを生成するためにいくつかの実装が定義されます。次に、構成に応じて、異なるクラスがインスタンス化されます。

補遺-コンクリート工場

コンクリートファクトリは、抽象ファクトリまたはファクトリメソッドの非抽象実装であると私は信じています。

したがって、documentをオーバーライドするcreateElementの独自の一般化を作成する場合、作成するクラスは具象ファクトリです。

同様に、WidgetFactoryは抽象ファクトリですが、SwingWidgetFactoryは具象ファクトリです。

39

FACTORY PATTERN:1つのファミリのオブジェクトを返します
ABSTRACT FACTORY:複数のファミリのオブジェクトを返します。

つまり、抽象ファクトリには複数のファクトリが含まれていると言えます。

4
subhashis

学ぶための最良の方法は間違いなく読むことです。これを見てください: http://www.dofactory.com/Patterns/Patterns.aspx

ファクトリメソッドは、オブジェクトの作成をサブクラスに延期します。これは、基本クラス/インターフェイスが定義されているが、クライアントコードがこのインターフェイスに対してオブジェクトを作成しないことを意味します。インターフェイスを実装するサブクラスは、オブジェクトを初期化するために残されています。

抽象ファクトリはここにあります: http://www.dofactory.com/Patterns/PatternAbstract.aspx#_self2

そのサイトにはすでに良い情報があります。次善の策はウィキをチェックすることです:

http://en.wikipedia.org/wiki/Design_pattern_%28computer_science%29

http://javadesign-patterns.blogspot.com/ はデザインパターンを学ぶのに良い場所です

4
JonH