はじめに:開始コードを学習のヘッドファーストデザインパターンの工場モデルの例にI通例。シンプルな工場、工場出荷時のパターンによって、Abstract Factoryパターンは、進化が続く彼らの類似点と相違点をまとめました。
ヘッドファーストは、工場出荷時の言葉はシンプルなデザインパターンではなく、プログラミングの練習が、それは、我々は工場出荷時のモードを見つける、それを使用してから私たちを妨げるものではないことを検討してください。
1、ピザ屋例
まず、私たちは、ピザの店を開く必要が翌営業合併症のない場合のために、私たちはすぐに論理を開発することができますし、ピザショップピザを注文しました
公共ピザOrderPizza(){ ピザピザ=新しいピザ(); pizza.Prepare(); pizza.Bake(); pizza.Cut(); pizza.Box(); ピザを返します。 } } publicクラスピザ{ //准备 公共ボイド準備(){} //烘烤 ます。public void焼く(){} //切片 ます。public voidカット(){} //装盒 ます。public voidボックス(){} }
我々はより多くのピザピザの種を持っている場合は、抽象クラスとして定義される必要があるかもしれピザの異なる種類のピザ、我々は抽象ピザの注文に合わせて注文し、注文を変換返します。
パブリッククラスPizzaStore { 公衆ピザOrderPizza(文字列型) { ピザピザ= NULL; IF(タイプ== "チーズ") { ピザ=新しいCheesePizza()。 } 他(タイプ== "viggie"){もし ピザ=新しいVeggiePizza()。 } //それ以外の場合は...... pizza.Prepare(); pizza.Bake(); pizza.Cut(); pizza.Box(); ピザを返します。 } } パブリック抽象クラスピザ { //准备 } {)(準備公衆が無効 //ベーキング ます。public void焼く(){} //スライス ます。public voidカット(){} //箱詰め ます。public voidボックスを(){} } //チーズピザ パブリッククラスCheesePizza:ピザ { } //ベジタリアンピザ パブリッククラスVeggiePizza:ピザ { }
ピザのカテゴリまたは削除ピザ屋ピザの増加は、その後、我々は変更を行います場合ここでは、と思うかもしれません。
設計原理は、拡張のために開いたが、修正のため閉鎖しました。私たちは一緒に変更パッケージのピザを作成する必要があります。これは、特別なピザ「工場」のカテゴリを作成するために出てきます。
あなたがオブジェクトをインスタンス化する必要はありませんので、静的な、それはプログラミングのための原則に従っていません。
パブリッククラスPizzaStore { 公衆ピザOrderPizza(文字列型) { ピザピザ= SimplePizzaFactory.CreatePizza(タイプ)。 pizza.Prepare(); pizza.Bake(); pizza.Cut(); pizza.Box(); ピザを返します。 } } パブリック静的クラスSimplePizzaFactory { パブリック静的ピザCreatePizza(文字列型){ ピザピザ= NULL; IF(タイプ== "チーズ") { ピザ=新しいCheesePizza()。 } そうであれば(タイプ== "viggie") { ピザ=新しいVeggiePizza(); } ピザを返します。 } }
これは、単純な工場(staticファクトリ)であるシンプルなピザパッケージを一緒に作成され、植物は単に静的でないクラスではなく、単純な工場専門のデザインパターン(時々、混同されることができる、すなわち、これは、「工場出荷時のモデルがあること「)を、プログラミングは、我々は通常、習慣を行うよりようになります。私たちは、部分的にしか変更があった場合ファクトリクラスを変更する必要にカプセル化された変更されます。
2、より多くのピザ
今、私たちは米国スタイルのピザ屋(USSytlePizzaStore)、中国風のピザ(CHNSytlePizzaStore)、例えば、より多くのピザを開きたいです。
私たちは、単純なファクトリパターンを使用したピザの工場の二つの異なるスタイルを作成し、取得するために、対応するピザの工場を使ってピザの二つの異なるスタイル、ピザ店の様々なスタイルを作成することができます。
しかし、我々は、変化点ピザ屋のこの時点です。私たちは、ピザのちょうど異なるスタイル、ピザ構造やプロセスが一定のルールに従っている願っています。工場出荷時のモデル:この時点で、私たちはより良い解決策を持っています。
私たちはどのように達成するかを見て次に
パブリック抽象クラスPizzaStore { 公衆ピザOrderPizza(文字列型) { ピザピザ= CreatePizza(タイプ)。 pizza.Prepare(); pizza.Bake(); pizza.Cut(); pizza.Box(); ピザを返します。 } パブリック抽象ピザCreatePizza(文字列型)。 } publicクラスUSSytlePizzaStore:PizzaStore { 公共オーバーライドピザCreatePizza(文字列型) { ピザピザ= NULL; IF(タイプ== "チーズ") { ピザ=新しいUSStyleCheesePizza(); { } 他(タイプ== "viggie")であれば { ピザ=新しいUSStyleVeggiePizza()。 } ピザを返します。 } } publicクラスCHNSytlePizzaStore:PizzaStore { 公共オーバーライドピザCreatePizza(文字列型) { ピザピザ= NULL; IF(タイプ== "チーズ") { ピザ=新しいCHNStyleCheesePizza()。 } それ以外の場合(タイプ== "viggie") ピザ=新しいCHNStyleVeggiePizza(); } ピザを返します。 } } //米国のチーズのピザ パブリッククラスUSStyleCheesePizza:ピザ { } //米国ベジタリアンピザ パブリッククラスUSStyleVeggiePizza:ピザ { } // CHNチーズのピザ パブリッククラスCHNStyleCheesePizza:ピザ { } //ベジタリアンピザCHN CHNStyleVeggiePizzaクラスのパブリック:ピザ { }
我々はPizzaStoreは抽象クラスに変更することを見ることができることを実現することで、ピザの彼らの異なるスタイルの異なる抽象クラスピザ屋のリターンを継承します。
後その増加製品へと、私たちは具象サブクラスは、ピザの店を作成するピザを修正するように設計、ピザ店自体は実装プロセスおよび他のピザのお店には影響しません。
ファクトリメソッドパターンは:サブクラスに延期許可したクラスをインスタンス化するファクトリメソッドをインスタンス化するクラスを決定するサブクラスを作成するオブジェクトのインタフェースを定義します。
シンプルな差植物工場方法:簡単な植物のようなサブクラスファクトリメソッドのルックス。シンプルな工場は、完全に所定の位置にプロセスをすべてのものを置くファクトリメソッドは、フレームワークを作成することですが、サブクラスが実装する方法を決定しましょう。
3、ピザ異なる材料
ピザショップの異なるスタイルは、ピザの異なるスタイルを持って、ピザのピザは、材料の一部が異なるスタイルであるように、異なる原料からこれらの異なるスタイルが変化を引き起こしました。
例えば、ピザ原料工場のために中国へレッツ・ビルドの植物原料や原料を、
//披萨原料工厂接口
パブリックインターフェイスPizzaIngredientFactory { 公共ベジCreateVeggie()。 公共チーズCreateCheese(); }
//具体工厂实现
パブリッククラスCNHPizzaIngredientFactory:PizzaIngredientFactory { 公共チーズCreateCheese() { )(新しいCHNCheeseを返します。 } 公共ベジCreateVeggie() { (新しいCHNVeggieを返します)。 } } パブリック抽象クラスベジ { } publicクラスUSVeggie:ベジ{ } publicクラスCHNVeggie:ベジ{ } パブリック抽象クラスチーズ { } publicクラスUSCheese:チーズ { } パブリッククラスCHNCheese:チーズ { }
そして、ピザをやり直します
ピザ抽象クラスパブリック { パブリック文字列名; 野菜野菜、 チーズチーズ; //は準備 ;)(準備パブリック抽象ボイド 焼成// ベーク(){}ボイドパブリック //スライス 公共ボイドカット(){} //カートニングを ボックスボイドパブリック(){} }
彼は抽象野菜とチーズの原料に入社し、彼がどのような材料とピザの異なるスタイルの具象サブクラスを作ることにしたので、我々は、になる抽象メソッドを用意しましょう。その後、我々はCheesePizzaに、たとえば、サブクラスをやり直します
//奶酪披萨 パブリッククラスCheesePizza:ピザ { PizzaIngredientFactory IngredientFactory。 公共CheesePizza(PizzaIngredientFactory IngredientFactory){ this.IngredientFactory = IngredientFactory。 } パブリックオーバーライドボイドは()の準備 { IngredientFactory.CreateCheese()を。 } }
修正中国のピザショップ
パブリッククラスCHNSytlePizzaStore:PizzaStore { 公共オーバーライドピザCreatePizza(文字列型) { ピザピザ= NULL;
//创建中国原材料工厂 CNHPizzaIngredientFactory ingredientFactory =新しいCNHPizzaIngredientFactory(); IF(タイプ== "チーズ") { ピザ=新しいCheesePizza(ingredientFactory)。 } 他(タイプ== "viggie")であれば { ピザ=新しいVeggiePizza(ingredientFactory)。 } ピザを返します。 } }
このシリーズの変革を通して、私たちはまた、抽象工場、抽象工場を作成するために使用される原料として知られている植物の新しいタイプを導入しました。
我々は、我々は変更がサブクラスを拡張させることができるように機能を拡張する必要がありそうならば、抽象工場コードは、実際の工場から切り離されている使用しています。
類似点とファクトリメソッドと抽象工場の長所と短所との違い
同じことは:オブジェクトを作成するために使用されています。
異なる:組み合わせを使用して、継承、抽象工場を使用してファクトリメソッド。
長所:ファクトリメソッドは、特定の種類、一緒関連製品のグループの集まりのための抽象ファクトリーから切り離さための唯一の責任です。
短所:サブクラスのそれぞれを修正するための抽象工場の拡張インタフェースが必要。