定義:コンクリートクラスを指定せずに、関連または相互依存のオブジェクトのセットを作成するためのインターフェイスを提供します。
タイプ:クラスパターンクラス図を作成します:
抽象的な工場パターンと工場の方法パターンの違い
抽象工場パターンは、ファクトリーメソッドパターンのアップグレードバージョンであり、関連するまたは相互依存オブジェクトのセットを作成するために使用されます。 ITとFactoryメソッドモデルの違いは、工場メソッドモデルが製品階層構造をターゲットにすることです。一方、抽象的な工場モデルは、複数の製品階層構造をターゲットにしています。プログラミングでは、製品構造は通常、インターフェイスまたは抽象クラスとして現れます。つまり、工場メソッドモデルによって提供されるすべての製品は、同じインターフェイスまたは抽象クラスから派生し、抽象工場モデルが提供する製品は異なるインターフェイスまたは抽象クラスから派生します。
抽象的な工場モデルには、製品ファミリの概念があります。いわゆる製品ファミリは、さまざまな製品階層の機能的に関連する製品で構成される製品のファミリーを指します。抽象工場モデルが提供する一連の製品は、製品ファミリを形成しています。一方、工場メソッドが提供する一連の製品は、階層構造と呼ばれます。私たちは、それらの違いを示すために、まだ車を生産する例を使用しています。
上記のクラス図では、ハッチバックとセダンは2つの異なる階層構造と呼ばれます。一方、2.0変位車両と2.4排気車両は、2つの異なる製品ファミリと呼ばれます。より具体的には、2.0分割ハッチバックと2.4ディスプレースメントハッチバックは同じレベル構造に属し、2.0分割セダンと2.4分割セダンは別のレベル構造に属します。 2.0分割ハッチバックと2.0分散セダンは同じ製品ファミリに属し、2.4分割ハッチバックと2.4分割セダンは別の製品ファミリーに属します。
階層構造と製品ファミリの概念を理解すると、ファクトリーメソッドモデルと抽象工場モデルの違いを理解できます。工場のすべての製品が同じ階層構造に属している場合、それらはファクトリーメソッドモデルに属します。工場の製品が複数の階層構造から来ている場合、それらは抽象的な工場モデルに属します。この例では、工場モデルが2.0変位ハッチバックと2.4変位ハッチバックを提供する場合、工場メソッドモデルに属します。工場モデルが2つの製品、2.4変位ハッチバック、2.4変位セダンを提供する場合、この工場モデルは、2つの異なる階層構造に属するため、この工場モデルは抽象的な工場モデルです。もちろん、工場が4つのモデルすべての製品を提供する場合、製品は2つの階層構造に属しているため、もちろん抽象的な工場モデルに属します。
例
工場クラスの抽象クラスの例を見てみましょう。
パッケージAbstractFactory;パブリックアブストラクトクラスAbstractCreator {//製品メソッドの作成public Abstract AbstractProducta CreateProducta(); // b製品メソッドの作成public abstract abstractproductb createproductb();}製品の抽象クラスa
パッケージAbstractFactory;パブリックアブストラクトクラスAbstractProducta {//製品が共有する方法Public void sharemethod(){system.out.println( "製品a ..." a ... "); } //メソッド製品の異なるサブプロダクトは、公共の抽象的なvoid dosomething(); }抽象クラスの製品b
パッケージAbstractFactory;パブリックアブストラクトクラスAbstractProductb {//製品Bで共有される方法b public void sharemethod(){system.out.println( "製品Bが共有するビジネスロジック処理メソッド"); } //製品Bのさまざまなサブプロダクトパブリックアブストラクトvoid dosomething(); }工場実装クラスパッケージAbstractFactory; public class creator1は、abstractcreator {@override public abstractproducta createproducta(){return new Producta1(); } @Override public abstractProductb createProductb(){return new Productb1(); }} Factory実装クラスパッケージAbstractFactory; public class creator2は、abstractcreatorを拡張します{@override public abstractproducta createproducta(){return new Producta2(); } @Override public AbstractProductb createProductb(){return new ProductB2(); }}製品A1
パッケージAbstractFactory;パブリッククラスProducta1は、AbstractProducta {@Override public void dosomething(){system.out.println( "製品A1 ..."のビジネスロジック処理方法... "); }}製品A2
パッケージAbstractFactory;パブリッククラスProducta2は、AbstractProducta {@Override public void dosomething(){system.out.println( "製品A2のビジネスロジック処理方法..."); }}製品B1
パッケージAbstractFactory;パブリッククラスProductB1は、AbstractProductb {@Override public void dosomething(){system.out.println( "B1のビジネスロジック処理方法..."); }}製品B2
パッケージAbstractFactory;パブリッククラスProductB2は、AbstractProductb {@Override public void dosomething(){system.out.println( "B2のビジネスロジック処理方法..."); }}抽象的な工場パターンの利点
工場メソッドモデルの利点を持つことに加えて、最も重要な利点は、製品ファミリをクラス内で制約できることです。いわゆる製品ファミリは、一般に、多かれ少なかれ特定の関係を持っています。抽象工場モデルは、管理専用の新しいクラスを導入することなく、クラス内の製品ファミリ間の関係を定義および説明できます。
抽象的な工場パターンの短所
製品ファミリを拡大することは非常に面倒な作業になります。新製品を製品ファミリに追加する必要がある場合、ほとんどすべての工場クラスを変更する必要があります。したがって、抽象工場モデルを使用する場合、製品階層構造の分割が非常に重要です。
適用可能なシナリオ
作成するオブジェクトが相互に関連する一連の製品ファミリである場合、抽象的な工場パターンを使用できます。より明確にするために、継承システムでは、複数の階層構造がある場合(つまり、複数の抽象クラスが存在する場合)、各階層構造に分割された実装クラス間に特定の相関または制約があります。抽象工場モデルを使用できます。各階層の実装クラス間に関連性や制約がない場合、複数の独立した工場を使用して製品を作成する方が適切です。
要約します
シンプルな工場モデル、ファクトリーメソッドモデル、または抽象的な工場モデルであろうと、それらはすべて工場モデルに属し、形と特性が非常に類似しています。彼らの究極の目標は、切り離すことです。それを使用する場合、このパターンがファクトリーメソッドなのか抽象的な工場モデルであるかを気にする必要はありません。なぜなら、それらの間の進化はしばしば理解するのが難しいからです。多くの場合、新しい要件が来ると、少しの変更が加えられ、新しい方法が追加され、クラスの製品が異なる階層構造の製品ファミリを形成すると、抽象的な工場モデルになります。また、抽象的な工場モデルでは、製品が製品を形成しなくなるようにメソッドが縮小されると、工場メソッドモデルに進化します。
したがって、工場モードを使用する場合、結合を減らす目的が達成されたかどうかを気にする必要があります。