「西のデザインモード」が、プラントモデルの3つのタイプの違いを読んでいる間、理解は、この記事では、3の違いについて長所と短所を説明するために、非常に徹底的ではありません。
シンプルなファクトリパターン(簡易ファクトリー)
最初の製品カテゴリに共通のインタフェースを定義します
public interface Product{
//价格
int price();
//产品名
String getName();
}
3つの製品ProductA、ProductB、ProductCは、製品のインターフェイスを達成するためにありますされています
プロダクト
public class ProductA implements Product {
@Override
public int price() {
return 100;
}
@Override
public String getName() {
return "ProductA";
}
}
ProductB
public class ProductB implements Product {
@Override
public int price() {
return 200;
}
@Override
public String getName() {
return "ProductB";
}
}
ProductC
public class ProductC implements Product {
@Override
public int price() {
return 300;
}
@Override
public String getName() {
return "ProductC";
}
}
クラスの工場の生産、入力タイプに対応した製品の生産を定義します
public class Factory {
/**
* 根据生产类型生产对应的产品
* @param type
* @return
*/
public static Product createProduct(String type){
Product product =null;
switch (type){
case "A":
product = new ProductA();
break;
case "B":
product = new ProductB();
break;
case "C":
product = new ProductC();
break;
}
return product;
}
}
生成される入力製品に対応するタイプの製造
Product productA = Factory.createProduct("A");
System.out.println("productA name="+productA.getName()+",getPrice:"+productA.getPrice());
Product productB = Factory.createProduct("B");
System.out.println("productB name="+productB.getName()+",getPrice:"+productB.getPrice());
Product productC = Factory.createProduct("C");
System.out.println("productC name="+productC.getName()+",getPrice:"+productC.getPrice());
出力:
productA名= ProductA、getPrice:100
productB名= ProductB、getPrice:200
productC名= ProductC、getPrice:300
上記ユーザーが製品ProductDを追加する必要があるときに、簡単な工場モードの典型的な例であり、判決はそう、対応する分岐工場の生産プロセスのクラスを増加させなければならない、単純なファクトリパターンがオープン閉鎖の原則に違反します。
静的メソッドを使用して単純なファクトリパターンは、入力パラメータ、製品インスタンスの隠された内容に従って、対応する生成物を生成します。
概要:ファクトリクラスは、特定の製品に頼るだけでなく、クライアントのために、動的にインスタンスクライアントのクラスに関連付けられた選択条件に基づいて、決定するために必要なロジックが含まれている簡単な工場モードの最大利点。しかし、ときに開いて閉じられた原則に反し、需要の変化、元のクラスを変更する必要があり、。
ファクトリメソッドモデル(ファクトリメソッド)
Factory Methodパターンを通じ、我々は問題の単純なファクトリパターンを解決することができます。
まず、工場インターフェースを宣言し、すべての工場は、このインタフェースを実装する必要があります
public interface IFactory {
Product createProduct();
}
ProductAの生産工場FactoryA
public class FactoryA implements IFactory {
@Override
public Product createProduct() {
return new ProductA();
}
}
ProductB生産工場FactoryB
public class FactoryB implements IFactory {
@Override
public Product createProduct() {
return new ProductB();
}
}
同様に、より多くのモードのような生産工場FactoryC ProductC。
今、新しいFactory Methodパターンに従って生産されます
IFactory factoryA = new FactoryA();
Product productA = factoryA.createProduct();
System.out.println("productA name="+productA.getName()+",getPrice:"+productA.getPrice());
IFactory factoryB = new FactoryB();
Product productB = factoryB.createProduct();
System.out.println("productB name="+productB.getName()+",getPrice:"+productB.getPrice());
IFactory factoryC = new FactoryB();
Product productC = factoryC.createProduct();
System.out.println("productC name="+productC.getName()+",getPrice:"+productC.getPrice());
出力:
productA名= ProductA、getPrice:100
productB名= ProductB、getPrice:200
productC名= ProductC、getPrice:300
あなたが新製品ProductDを追加する必要がある場合には、唯一の既存のコードに影響を与えることなく達成することができ、対応するFactoryDの生産関数を作成する必要があり、それはと一致しているオープンクローズドの原則が、各追加の製品ので、我々は、対応する生産を追加する必要があります工場、追加の開発努力につながります。
概要:多型の使用の欠点は、植物は、カプセル化されたオブジェクト作成プロセスの利点を維持しながら、オープンクローズ植物の単純な原理は、違反克服します。
抽象ファクトリー(抽象ファクトリー)
今の贈り物を、対応する各製品に必要とし、我々はギフト製造工場を追加したいですか?実際には、このシナリオでは、各製品は、贈り物を添付しなければならないので、それは、必要ありませんので、我々は贈り物を生産するために、既存の工場を使用することができます。
共通インターフェースギフトの最初のセット
public interface Gift {
String getGiftName();
}
GiftA、GiftB、GiftCを増やします
public class GiftA implements Gift {
@Override
public String getGiftName() {
return "GiftA";
}
}
ファクトリインタフェースの変更、生産ギフトを向上させる方法
public interface IFactory {
Product createProduct();
Gift createGift();
}
FactoryA方法工場モードで変更、FactoryB、FactoryC
public class FactoryA implements IFactory {
@Override
public Gift createGift() {
return new GiftA();
}
@Override
public Product createProduct() {
return new ProductA();
}
}
製品や贈り物の生産
IFactory factoryA = new FactoryA();
Product productA = factoryA.createProduct();
Gift giftA = factoryA.createGift();
概要:Abstract Factoryパターンは、その特定のクラスを開発することなく、関連または依存オブジェクトインターフェイスのシリーズを作成しています。抽象ファクトリインタフェースは、抽象メソッドが作成されたすべての製品が含まれている必要があり、私たちは、工場が複数の製品カテゴリを生成することができ、複数のインターフェイスを実装して定義することができ、かつ同じFactory Methodパターン、Abstract Factoryパターンはまた、達成クローズドの原則の発展
についてのリンクをします。https://www.jianshu.com/p/d27d698802fd