簡単な紹介
シンプル/静的工場、ファクトリメソッドと抽象ファクトリー:「頭最初のデザインモード」によると、3つの工場出荷時のモードがあります。
注:実際には、ない静的なファクトリデザインパターンは、それがより多くのプログラミングの習慣のようなものです。しかし、ここで、それは誤ってそれが工場出荷時のモデルであることを主張し、区別の管理を容易にするために、[1]によって行われたノートに基づいています。
この記事では、静的なファクトリメソッドを記述しています。
1、定義:単純な静的メソッド、静的なファクトリを用いて、植物の定義。
2、理由:静的ファクトリーモード、無駄がオブジェクトのオブジェクト・インスタンスを作成しないようにするので、静的なファクトリを使用して簡単な方法を作成することが可能です。
3、短所:
・オブジェクトの振る舞いを作成するために、継承によって変更することはできません。
・クラスのパブリックまたは保護されたコンストラクタが含まれていない場合は、継承することはできません。
4、利点:
・一般的には、あなたが最も一般的に使用される方法の例を取得したいことは、パブリックコンストラクタを提供することで変更の実装は、唯一の静的なファクトリメソッドを変更する必要がある場合、クラスを呼び出しますが、静的なファクトリメソッドを使用して、より良い弾力があるでしょうそれは。
・そして、工事の方法は同じではありません、静的ファクトリメソッドは、独自の特定の名前を持つことができます。
・いつもと呼ばれる新しいオブジェクトを作成しないでください。外部の静的なファクトリメソッドを使用すると、あなたがノートに減らし、そのスレッドの安全性の問題を複製、悪い場所にインスタンスを作成することができるようにインスタンスが、その後、複数の通話をすることができ、予め用意され、単一の例を提供します。
・オリジナルの戻り値の型のいずれかのサブクラスのオブジェクトを返すことができます。
5 、特定の実装(完全なコード):
- 静的工場:処理内容のオブジェクトを作成します
パブリック クラスSimplePizzaFactory { 公衆ピザcreatePizza(文字列型){ ピザピザ = NULL ; もし(type.equals( "チーズ" )){ 返す 新しい)(CheesePizzaを。 } そう であれば(type.equals( "ペパロニ" )){ 戻り 新しい)(PepperoniPizzaします。 } そう であれば(type.equals( "クラム" )){ 戻り 新しい)(ClamPizzaします。 } そう であれば(type.equals( "野菜" )){ 返す 新しいVeggiePizzaを(); } 他の リターン はnull ; } }
- クライアント:静的なファクトリを使用してオブジェクトを作成するために使用されます
パブリック クラスPizzaStore { SimplePizzaFactory工場。 公共PizzaStore(SimplePizzaFactory工場){ この .factory = ファクトリ。 } 公共ピザorderPizza(文字列型){ ピザピザ。 ピザ = factory.createPizza(タイプ)。 pizza.prepare(); pizza.bake(); pizza.cut(); pizza.box(); リターン・ピザ。 } }
- 抽象製品カテゴリー:
パブリック 抽象 クラスピザ{ 文字列名。// 名称 文字列の生地。// 面团类型 文字列のソース。// 酱料类型 のArrayList <ストリング>トッピング= 新規のArrayList <ストリング>(); // 一套佐料 ボイドは(){調製 するSystem.out.println( "準備" + 名); System.out.println( "投げ生地..." ); System.out.println( "ソースを追加しています..." ); System.out.println( "トッピングを追加します:" )。 以下のための(int型I = 0; I <toppings.size(); I ++ ){ するSystem.out.println( "" + toppings.get(I))。 } } ボイドベーク(){ System.out.printlnは( "350で25分間焼きます" )。 } ボイドカット(){ System.out.printlnは(「対角スライスにピザをカット」)。 } ボイドボックス(){ System.out.printlnは(「公式PizzaStoreボックスに置きピザ」)。 } パブリック文字列のgetName(){ 戻り名。 文字列のtoString(){ StringBufferの表示= 新規のStringBuffer(); display.append( "------" +名+ "----- \ N" ); display.append(生地 + "\ n"は); display.append(醤油 + "\ n" ); 用(文字列トッピング:トッピング){ display.append(トッピング +を"\ n" ); } を返す)(display.toString。 } }
- 特定の製品カテゴリ:
// 芝士披萨 パブリック クラス CheesePizzaが延びピザ{ パブリックCheesePizza(){ 名前 = "チーズピザ" 。 生地 =「チーズ生地」。 醤油 =「CheeseSauce」。 toppings.add( "チーズチーズ" ); } } // 蛤蜊披萨 パブリック クラス ClamPizzaが延びピザ{ パブリックClamPizza(){ 名称 = "クラムピザ" 。 生地 =「ハマグリ生地」。=「ハマグリソース添え」。 (toppings.add "ハマグリ" )。 } } // 意式腊肠披萨 パブリック クラス PepperoniPizzaが延びピザ{ パブリックPepperoniPizza(){ 名称 = "ペパロニピザ" 。 生地 =「ペパロニ生地」。 醤油 =「ペパロニソース添え」。 (toppings.add "ペパロニ" )。 名前=「野菜ピザ」。 生地 =「ベジ生地」。 醤油 =「野菜醤油」。 (toppings.add "ベジ" )。 } }
- テスト:
パブリック クラスPizzaTest { 公共 静的 ボイドメイン(文字列[]引数){ SimplePizzaFactory工場 = 新しいSimplePizzaFactory()。 PizzaStore店 = 新しいPizzaStore(工場)。 ピザピザ = store.orderPizza( "チーズ" ); System.out.println( + pizza.getName()+ "\ n"は"イーサンが発注しました" ); System.out.println(ピザ)。 ピザ = store.orderPizza( "野菜" ); System.out.println( + pizza.getName()+ '\ n'を"ジョエルは、注文した" ); のSystem.outを。 } }
下に示すような結果を操作します:
参考文献:
[1]第1のヘッドデザインパターンを