Java の 3 つのファクトリ モードをすばやく簡単に理解する

高洛峰
リリース: 2016-12-15 14:31:45
オリジナル
1042 人が閲覧しました

素早く簡単に理解できる 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 つだけの場合、抽象ファクトリ パターンは実際にはファクトリ メソッド パターンに縮退します。

//フルーツインターフェイスを定義します 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("オレンジを食べます。") } } //肉のインターフェイスを定義します。 void buyMeat( ); void EatMeat(); } //豚肉の実装インターフェイス public class BigMeat は肉を実装します { @Override public void buyMeat() { System.out.println("豚肉を買います。") } @Override public void EatMeat( ) { System .out.println("豚肉を食べる。") } } //牛肉実装インターフェイス public class CowMeat は Meat{ @Override public void buyMeat() { System.out.println("牛肉を買う。") } @Override public void EatMeat() { System.out.println("Eat Beef.") } } //コンシューマ インターフェイスを定義します public Interface UserFactory { /**※フルーツファクトリー方式*/ public Fruit getFruit(Fruit whatFruit) / ** ※食肉工場法*/ public Meat getMeat(Meat whatMeat); } // コンシューマー・インターフェースを実装します public class ユーザーが UserFactory を実装します { @Override public Fruit getFruit(Fruit whatFruit) { return whatFruit } @Override public Meat getMeat(Meat whatMeat; ) { return whatMeat; } } //テストクラス public class TestUserFactory { public static void main(String[]args){ Fruit apple=new Apple(); //Consumer インスタンス User me=new User(); me.getFruit(apple).eatFruit(); me.getMeat(bigMeat).buyMeat(); 出力: リンゴを食べる。 豚肉を買う。


概要:
A: 抽象ファクトリ パターンはクライアントにインターフェイスを提供し、クライアントが特定の種類の製品を指定することなく、複数の製品ファミリーの製品オブジェクトを作成できるようにします。これが抽象ファクトリー パターンの目的です。
B: 抽象ファクトリー パターンは、あらゆる形式のファクトリー パターンの中で最も抽象的かつ一般的な形式です。
C: 抽象ファクトリ パターンとファクトリ メソッド パターンの最大の違いは、ファクトリ メソッド パターンが製品 (果物) の階層構造を対象としているのに対し、抽象ファクトリ パターンは複数の製品の階層構造 (果物、肉) に直面する必要があることです。


3 つの Java ファクトリー モードに関するより速くてわかりやすい関連記事については、PHP 中国語 Web サイトに注目してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート