この記事では、最後のタイプのファクトリーについて説明します。
抽象ファクトリー パターン定義 (Baidu Encyclopedia より) から始めましょう:
抽象ファクトリー パターンは、すべての形式のファクトリー パターンの中で最も抽象的で一般的な形式です。抽象ファクトリパターンとは、複数の抽象ロールが存在する場合に使用されるファクトリパターンを指します。
抽象ファクトリー パターンはクライアントにインターフェイスを提供し、クライアントが特定の製品を指定せずに複数の製品ファミリーの製品オブジェクトを作成できるようにします。リスコフ置換原則によれば、
親タイプを受け入れる場所はすべて、サブタイプを受け入れることができる必要があります。したがって、システムが実際に必要とするのは、これらの抽象的な製品のインスタンスではなく、これらの抽象的な製品の役割と同じタイプのいくつかのインスタンスだけです。
言い換えれば、これらの抽象製品の具体的なサブクラスのインスタンスです。ファクトリ クラスは、抽象製品の具象サブクラスのインスタンスを作成する役割を果たします。
UML クラス図
特定のコード:
public class Client {public static void main(String[] args) {// Creator benzCreator = new BenzCreator();// benzCreator.createCar().run();//// Creator bmwCreator = new BmwCreator();// bmwCreator.createCar().run();AbstractFactory factory1 = new Factory1(); factory1.createProductA().getProductAName(); factory1.createProductB().getProductBName(); AbstractFactory factory2 = new Factory2(); factory2.createProductA().getProductAName(); factory2.createProductB().getProductBName(); } }public interface AbstractFactory { AbstractProductA createProductA(); AbstractProductB createProductB(); }public class Factory1 implements AbstractFactory { @Overridepublic AbstractProductA createProductA() {return new ProductA1(); } @Overridepublic AbstractProductB createProductB() {return new ProductB1(); } }public class Factory2 implements AbstractFactory { @Overridepublic AbstractProductA createProductA() {return new ProductA2(); } @Overridepublic AbstractProductB createProductB() {return new ProductB2(); } }public interface AbstractProductA { String getProductAName(); }public class ProductA1 implements AbstractProductA { ProductA1(){ System.out.println("产品A1"); } @Overridepublic String getProductAName() {return "产品A1名称"; } }public class ProductA2 implements AbstractProductA { ProductA2(){ System.out.println("产品A2"); } @Overridepublic String getProductAName() {return "产品A2名称"; } }public interface AbstractProductB { String getProductBName(); }public class ProductB1 implements AbstractProductB { ProductB1(){ System.out.println("产品B1"); } @Overridepublic String getProductBName() {return "产品B1名称"; } }public class ProductB2 implements AbstractProductB { ProductB2(){ System.out.println("产品B2"); } @Overridepublic String getProductBName() {return "产品B2名称"; } }
製品ファミリー:
は、異なる製品レベル構造に配置された関連機能を持つ製品ファミリーを指します
特定例:
適切ではないかもしれない例を示します
たとえば、私たちのコンピューターは 32 ビットと 64 ビットの両方で、対応するマシンには対応するビットのソフトウェアがインストールされます
2 枚の CD には 32 ビットが保存されています。コンピューターをインストールするときは、CD を入手するだけでソフトウェア全体をインストールできるため、各ソフトウェアを 1 つずつ探す必要はありません。
ここのディスクは特定のファクトリーです。各ディスクに QQ と 360 がある場合はどうなりますか (ただ戦いたいだけですか?)
ここの 32 ビット ディスクは上記のコードの Factory1 です。ここの 64 ビット ディスクは上記のコードの Factory2 です。
CD の 32 ビット QQ は ProductA1、360 は ProductB1 です
64 ビット CD の QQ は ProductA2、360 は ProductB2 です
私のような初心者ユーザーは、適切な CD を入手するだけで、見つける必要はありません。 QQ の正しい数を同時に 360 桁、クールだと思いませんか?
利点と欠点
利点:
クライアントが特定の実装を知る必要がないように、インターフェイスと実装を分離します。
128 ビット マシンが登場した場合と同様に、追加の CD を追加するだけで、製品ファミリーを簡単に切り替えることができます。
短所:
新しい製品を拡張するのは簡単ではありません (製品を追加するためにどれだけのクラスとメソッドを追加する必要があるかを想像してみてください)。
クラスの階層構造が複雑です(クラス図を見ていると吐きそうになります)
本質:
前にも言いましたが、ファクトリメソッドの本質は実装を選択することです。特定の製品
その場合、抽象ファクトリーが選択されます。 製品ファミリーは、単一の製品から製品ファミリーに変わりました。
さて、3つのファクトリーモデルについてお話しましたが、まずはそれらの関係性、違い、進化の過程について掘り下げて、それについては後で書きたいと思います。
以上が抽象ファクトリーパターンとはの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。