アウトライン
定義:Abstract Factoryパターンを作成し提供し、関連する一連のまたは依存オブジェクトのインタフェースを
拡張:彼らの具象クラスを指定せず
タイプ:作成するタイプ
抽象ファクトリーは、通常の使用では、同じテーマやカプセル化された別々の工場で抽象工場の具体的な実装を作成するためのクライアントプログラムを設定し、インターフェイスとして主題を作成するために、抽象工場の具体的な実装を使用することができ、我々は気にしません工程で得られた内部オブジェクトの特定のタイプ、
共通のインタフェースを使用して、当社のクライアントオブジェクトので、Abstract Factoryパターンの実装オブジェクトのセットの詳細とその使用を分離しました。
該当シーン
クライアント(アプリケーション層)は、実現の詳細、製品クラスのインスタンスが作成される方法に依存しません
オブジェクトを作成して使用して、(同じ製品ファミリに属する)関連製品の一連のオブジェクトに重点を置いた反復コードの多くを必要と
クライアントは、特定の実装に依存しないように、製品のクラスライブラリは、製品のすべては、同じインターフェイスで発生します
利点
コードの分離のアプリケーション層における具体的な製品は、創造の詳細を気にしません
一緒に作成するための統一された製品ファミリのシリーズ
短所
すべての可能な生成物収集のために提供するために、製品ファミリが困難な新製品の展開で作成された、抽象ファクトリインタフェースを変更する必要があります
システムの抽象化と理解の難しさを増やします
抽象ファクトリー - 製品グレードの構造や製品ファミリ
同じ製品登録の同じ色を代表して
同じ形状の異なる色は、製品ファミリーであります
たとえば、Huawei社の生産拠点だけでなく、携帯電話の生産は、また、チップを生産、Huawei社の製品は、同じレベルに属する製品は、Huawei社のブランドであります
縦向きに、この携帯電話を確認するにはキビのボックスと同じ製品群である他の携帯電話のブランドであり
上矢印コンクリート工場です
ショー
CakeFactoryインタフェース
package softwareDesign.coding.factoryMethod.abstractFactory;
public interface CakeFactory {
Cake getCake();
GiftBox getGiftBox();
}
ケーキ抽象クラス
package softwareDesign.coding.factoryMethod.abstractFactory;
public abstract class Cake {
public abstract void produce();
}
ギフトボックス抽象クラス
package softwareDesign.coding.factoryMethod.abstractFactory;
public abstract class GiftBox {
public abstract void produce();
}
SnowCakeクラス
package softwareDesign.coding.factoryMethod.abstractFactory;
public class SnowCake extends Cake{
@Override
public void produce() {
System.out.println("生产雪花蛋糕...");
}
}
SnowCakeGiftBox类
package softwareDesign.coding.factoryMethod.abstractFactory;
public class SnowCakeGiftBox extends GiftBox{
@Override
public void produce() {
System.out.println("生产雪花蛋糕礼盒...");
}
}
SnowCakeFactoryクラス
package softwareDesign.coding.factoryMethod.abstractFactory;
public class SnowCakeFactory implements CakeFactory{
@Override
public Cake getCake() {
return new SnowCake();
}
@Override
public GiftBox getGiftBox() {
return new SnowCakeGiftBox();
}
}
CCakeクラス
package softwareDesign.coding.factoryMethod.abstractFactory;
public class CCake extends Cake{
@Override
public void produce() {
System.out.println("生产巧克力蛋糕...");
}
}
CCakeGiftBoxクラス
package softwareDesign.coding.factoryMethod.abstractFactory;
public class CCakeGiftBox extends GiftBox{
@Override
public void produce() {
System.out.println("生产巧克力蛋糕礼盒");
}
}
CCakeFactoryクラス
package softwareDesign.coding.factoryMethod.abstractFactory;
public class CCakeFactory implements CakeFactory {
@Override
public Cake getCake() {
return new CCake();
}
@Override
public GiftBox getGiftBox() {
return new CCakeGiftBox();
}
}
Testクラス
package softwareDesign.coding.factoryMethod.abstractFactory;
public class Test {
public static void main(String[] args) {
CakeFactory cakeFactory = new SnowCakeFactory();
Cake cake = cakeFactory.getCake();
GiftBox giftBox = cakeFactory.getGiftBox();
cake.produce();
giftBox.produce();
}
}
私たちは、そのクラス図を見てください:
クラスCakeFactoryで始まります
あなたはフルーツケーキとフルーツケーキのギフトボックスを増やす場合は簡単に拡張することができます
テストテストに参加:
テストのみの製品植物を意味するものを気に。アプリケーション層とコンクリートボックスや他の雪やケーキが切り離されています。
欠点は、あなたが製品レベルを拡張したい場合は、それは確かに体全体に影響を及ぼし、開閉の原則に反するとなり、また明白です。