ファクトリパターン
序文
また、モデルを作成するために、工場出荷時のモデルとして知られ、それは、オブジェクトを構築するための最良の方法です。自然のプラントモデルは、new演算子のインスタンスオブジェクトを作成するファクトリメソッドに置き換えられています。
前に、我々は、オブジェクトをインスタンスシンプルにしたい場合は、通常の考えでは、コンストラクタによって単純シンプル=新しいシンプル(パラメータ)を作成することです。あなたは、このような単純なことのような単純なインスタンスの初期化ではない作業割り当てを作成する場合は、それはあなたが単純なオブジェクトを作成する必要がある時はいつでもそう、あなたは非常に長いコードのためにこれを書くために必要な、コードの長いの部品であってもよいです。このような結合我々のコードは非常に高くなります。私たちは仕事の別々のインスタンスの使用のインスタンスを作成し、使用するために作業する必要があるので、工場出荷時のモデルは、パッケージ一緒の作業例を作成するためのファクトリメソッドを使用します。だから私たちは、あなたが問題のそれらの複雑な事例を心配する必要はありませんオブジェクトを呼び出すために必要がある場合。
シンプルなファクトリパターン
製品カテゴリでシンプルAbstract Factoryパターン:特定の製品の共通の属性を定義するには、ファクトリクラスは、特定の製品の生産を担当しています。
私たちは、携帯電話のさまざまなブランドを生産する必要があるとし
その後、我々は電話を定義するために開始することができますインターフェイス
public interface Phone {
String getBrand();
}
AppleとHuawei社:次に、2つの携帯電話のブランドを作成します
public class Apple implements Phone {
public String getBrand() {
return "apple";
}
}
public class Huawei implements Phone {
public String getBrand() {
return "huawei";
}
}
携帯電話を生産する工場の定義
public class SimpleFactory {
public static Phone getPhone(String PhoneName){
if ("apple".equals(PhoneName)){
return new Apple();
}else if ("Huawei".equals(PhoneName)){
return new Huawei();
}
return null;
}
}
要約:
シンプルな植物から、我々は作成するために、静的メソッドを使用することができますし、使用するオブジェクトを分離しました。私達はちょうど私たちが必要とするオブジェクトを取得することができるパラメータを渡すメソッドを呼び出す必要があります。
しかし、我々は問題の単純なファクトリパターンのシリーズを見つけます:
- ファクトリクラスは、工場が正常に動作していないと、システム全体が影響を受けることになる論理を作成するために、すべてのインスタンス(製品)一元化します。
- 「オープン - クローズ原則」に反して、新製品を追加すると、植物のロジックにつながるファクトリクラスのロジックを変更する必要があります一度はあまりにも複雑です。
- staticファクトリメソッドを使用しているため、単純なファクトリパターンは、静的メソッドは継承の役割に基づいて階層構造を形成することができない植物の原因となり、継承して書き換えることができません。
Factory Methodパターン:上記の問題を解決するために、我々は新しいデザインパターンを使用します。
ファクトリメソッドパターン
ファクトリーモードとして知られているファクトリメソッドモデル、及び仮想モード多形工場設定モードでは、定義された共通のインターフェースを作成する責任親クラス・ファクトリ・オブジェクトを定義することによって、サブクラスは、特定のオブジェクトを生成する責任があります。
クラスがインスタンス化されるべきサブクラスをサブクラス完了(特に植物)ファクトリクラス、すなわちを遅延させる(作成された製品を特定)インスタンス化される(作成)されたクラス。
ここでは、携帯電話の生産は、Factory Methodパターンを使用するように変更上記の例では、単純なファクトリパターンになります
作成抽象ファクトリクラス、プラント固有のパブリック・インタフェースの定義を
public abstract class PhoneFactory {
Phone getPhone();
}
作成コンクリートファクトリクラス作成メソッドの定義の特定の例に(抽象ファクトリクラスの継承)、製品の対応します
public class AppleFactory extends PhoneFactory {
public Phone getPhone() {
return new Apple();
}
}
public class HuaweiFactory extends PhoneFactory {
public Phone getPhone() {
return new Huawei();
}
}
別の携帯電話を生産する方法の具体的なファクトリクラスを呼び出すことで、外の世界
要約:
利点
- より多くの開口部に沿って - 製品を追加するときに開閉原理、即ち、唯一の工場に対応する対応する特定の製品のクラスとサブクラスを追加する必要があります。
- 単一責任の原則に沿って、各特定のファクトリクラスは、対応する製品を作成するための唯一の責任です。
- 形成することができる継承階層に基づいて、静的なファクトリメソッドを使用しないでください。
短所
製品の新しいクラスを追加することに加えて、新たな製品を追加する場合だけでなく、システムクラス増加の対の数に対応する特定のファクトリクラスを提供するために、ある程度のシステムの複雑さは、また、より多くのクラスが存在しますニーズがコンパイルおよび実行されるように、システムは、いくつかの追加のオーバーヘッドをもたらすでしょう。
確保しつつファクトリメソッド内で修正のため閉鎖するが、他の製品ならば交換する、植物系を使用する方法は、ファクトリクラスの特定の例を変更する必要性が依然として存在します。
Abstract Factoryパターン
抽象植物は、あらゆる形態での工場出荷時のパターンの最も抽象的で一般的な形式です。場合役割複数の場合抽象抽象工場モデルを使用するための植物を意味します。クライアントはターゲット製品、製品ファミリの複数を作成するために、特定の状況で製品を指定することに抽象ファクトリーモードは、クライアントへのインターフェースを提供することができます。
Abstract Factoryパターンファクトリメソッドパターンがあること、相対的である、Factory Methodパターンは、1つの製品ファミリのためのものであり、Abstract Factoryパターンは、複数の製品ラインのためである、すなわち、Factory Methodパターンは、製品のシリーズファクトリクラス、Abstract Factoryパターンであります複数の製品ラインには、ファクトリクラスです。
我々は2つの製品のインターフェイス電話とコンピュータを持っていると仮定し、各製品は、Apple社や華為シリーズなどのシリーズの様々なサポートしています。だから、製品の各シリーズは、iPhone、Huawei社、MacBookの、MateBookあること。実行時に製品ファミリのシリーズを作成することができるように、我々は、各シリーズの製品ファミリのための工場AppleFactoryとHuaweiFactoryを作成することができます。各工場は二つの方法getPhoneとgetComputerを有し、対応する商品を返し、これらの2つの方法は、インタフェースAbstractFactoryに抽象化することができます。このように、我々は、製品ラインの実行時のニーズを作成するように選択することができます。
特定のコード:
AbstractFactory:
public abstract class AbstractFactory {
public abstract Phone getPhone();
public abstract Computer getComputer();
}
AppleFactory:
public class AppleFactory extends AbstractFactory {
public Phone getPhone() {
return new Iphone();
}
public Computer getComputer() {
return new MacBook();
}
}
HuaweiFactory:
public class HuaweiFactory extends AbstractFactory {
public Phone getPhone() {
return new Huawei();
}
public Computer getComputer() {
return new MateBook();
}
}
要約:
利点
- 製品カテゴリを追加する場合、唯一の工場に対応する対応する特定の製品のクラスとサブクラスを追加する必要があります。
- 階層構造は、継承に基づいて形成することができ、静的なファクトリメソッドを使用しないでください
- よりに合わせてオープン - クローズ原理は、製品カテゴリを追加すると、のみ対応工場に適切な特定の製品カテゴリーとサブカテゴリーを追加する必要があります
- 単一責任の原則に沿って、各特定のファクトリクラスは、対応する製品を作成するための唯一の責任があります
Factory MethodパターンとAbstract Factoryパターンの違いを要約すると:
- の組み合わせを使用して遺伝パターン、Abstract Factoryパターンを使用してファクトリメソッド
- パターンファクトリクラスオブジェクト、オブジェクトの抽象工場パターン生成ファミリを生成する方法
- ファクトリメソッドは、サブクラスを使用してオブジェクトモデルを作成するには、抽象的な工場モデルが実装されたインタフェースを使用して作成されたオブジェクト