素早く簡単に理解できる Java の 3 つのファクトリ パターン
1. シンプル ファクトリ パターン (Simple Factory)
は、共通のインターフェイスを持つ多数のクラスのインスタンス化を特に担当するパターンであり、どのクラスを事前に知る必要はありません。毎回インスタンス化します。これはオブジェクトを作成するためのインターフェイスを定義し、サブクラスはどのクラスをインスタンス化するかを決定します。
//フルーツインターフェイスを定義します public interface Fruit { void plantFruit(); void EatFruit(); } //Apple はフルーツインターフェイスを実装します public class Apple は Fruit { @Override public void plantFruit() { System.out.println (" リンゴを植えます。 "); } @Override public void EatFruit() { System.out.println("リンゴを食べます。") } } //Orange はフルーツ インターフェイスを実装します public class Orange は Fruit { @Override public void plantFruit () { System.out.println("オレンジを育てます。"); } @Override public void EatFruit() { System.out.println("オレンジを食べます。") } } //フルーツファクトリー public class FruitFactory { public static Fruit getFurit( String FruitName) { // 単純なファクトリ モード if (fruitName.equalsIgnoreCase("Apple")) { // Apple の場合、Apple インスタンスを返します return new Apple() } else if (fruitName.equalsIgnoreCase(" Orange")) { // オレンジの場合はオレンジのインスタンスを返す return new Orange(); } else { return null; } } } //テストクラス public class Test { public static void main(String[]args) { // 単純なファクトリー パターンを呼び出します FruitFactory.getFurit("Orange").plantFruit() } } 出力: オレンジを植えます。
概要
A: リンゴを買いたい場合は、工場ロール (FruitFactory) にリクエストするだけです。依頼を受けた工場ロールは、どの製品を作成し提供するかを独自に決定します。
B: しかし、工場の役割 (FruitFactory) にとって、新しい製品の追加 (イチゴの追加など) は骨の折れるプロセスです。工場の役割は、各製品、その作成方法、およびそれらをいつ顧客に提供するかを知っている必要があります。つまり、新製品を受け入れるということは、工場を改造することを意味します。
C: したがって、この単純なファクトリーモデルのオープン性は比較的低いです。
============================================ ===== ================
2. ファクトリ メソッド パターン
オブジェクトの作成をコンストラクターではなく親クラスで定義された標準メソッドに任せます。どのような種類のオブジェクトを作成するかを特定のサブクラスまで決定します。
//フルーツインターフェイスを定義します public interface Fruit { void plantFruit(); void EatFruit(); } //Apple はフルーツインターフェイスを実装します public class Apple は Fruit { @Override public void plantFruit() { System.out.println (" リンゴを植えます。 "); } @Override public void EatFruit() { System.out.println("リンゴを食べます。") } } //Orange はフルーツ インターフェイスを実装します public class Orange は Fruit { @Override public void plantFruit () { System.out.println("オレンジを育てます。"); } @Override public void EatFruit() { System.out.println("オレンジを食べます。") } } //フルーツ ファクトリー ([b] 注:このファクトリーは、スケーラビリティに優れたインターフェイスであると宣言します[/b]) public interface FactoryMethod { /*** 工場での方法*/ Fruit getFruit() //フルーツを取得するプロセスを定義します} //Apple のフルーツ ファクトリーの実装 public class getAppleimplements FactoryMethod{ @Override public Fruit getFruit() { // TODO 自動生成されたメソッド スタブ return new Apple() } } //Orange のフルーツ ファクトリーの実装 public class getOrangeimplements FactoryMethod { @Override public Fruit getFruit(); { // TODO 自動生成されたメソッド スタブ return new Orange(); } } //テスト クラス public class TestFactoryMethod { public static void main(String[] args) { getApple apple = new getFruit(); EatFruit(); } } 出力: リンゴを食べます。
概要:
A: ファクトリ メソッド パターンと単純なファクトリ パターンの構造的な違いは明らかです。ファクトリ メソッド パターンのコアは抽象ファクトリ クラスですが、単純なファクトリ パターンはコアを具象クラスに配置します。ファクトリ メソッド パターンを使用すると、多くの具体的なファクトリ クラスが抽象ファクトリ クラスから作成動作を継承できるため、複数の単純なファクトリ パターンの合成となり、その結果、単純なファクトリ パターンが普及します。
B: ファクトリ メソッド パターンは、縮退後に単純なファクトリ パターンに非常に似たものになる可能性があります。システムに必要なのは具体的なファクトリ クラスが 1 つだけであると確信している場合、抽象ファクトリ クラスを具体的なファクトリ クラスにマージしたほうがよいと想像してください。いずれにせよ、特定のファクトリ クラスは 1 つだけなので、この時点では、ファクトリ メソッドを静的メソッドに変更すると、単純なファクトリ パターンが得られます。
C: 新しいフルーツを追加する必要がある場合は、新しいフルーツ クラスとそれに対応するファクトリー クラスを追加するだけです。クライアントを変更したり、抽象ファクトリ ロールや他の既存の具体的なファクトリ ロールを変更したりする必要はありません。新しい果物カテゴリを追加するために、このシステムは「オープン-クローズ」原則を完全にサポートしています。
D: Factory Method モードでは、1 つのカテゴリ (この例では果物など) のみが対象ですが、肉も購入したい場合は、Abstract Factory モードが役に立ちません。
============================================== === ==============
3. Abstract Factory パターン (Abstract Factory)
Abstract Factory パターンは、Simple Factory パターンの拡張であると言えます。オブジェクト作成の複雑さ。
抽象ファクトリー パターンでは、1 つ以上の抽象製品が存在し、1 つ以上の製品ファミリーを形成する場合があります。 製品ファミリーが 1 つだけの場合、抽象ファクトリ パターンは実際にはファクトリ メソッド パターンに縮退します。
概要:
A: 抽象ファクトリ パターンはクライアントにインターフェイスを提供し、クライアントが特定の種類の製品を指定することなく、複数の製品ファミリーの製品オブジェクトを作成できるようにします。これが抽象ファクトリー パターンの目的です。
B: 抽象ファクトリー パターンは、あらゆる形式のファクトリー パターンの中で最も抽象的かつ一般的な形式です。
C: 抽象ファクトリ パターンとファクトリ メソッド パターンの最大の違いは、ファクトリ メソッド パターンが製品 (果物) の階層構造を対象としているのに対し、抽象ファクトリ パターンは複数の製品の階層構造 (果物、肉) に直面する必要があることです。