爲建立一組相關或相互依賴的對象提供一個接口,並且無須指定它們的具體類
能夠把此類工廠比作一個有多個生產線的車間,生產線產出的產品有類似的約束或者依賴的關係, 好比:我要生產汽車就須要同時生產汽車對應型號的鑰匙
· 封裝性ide
高層模塊不關心產品的實現,只關心抽象,接口, 具體的工廠類負責建立對象,而沒必要知道內部產品的關聯,以及依賴關係的實現,只須要知道工廠類便可生成一個對象
· 產品族內的約束爲非公開狀態code
對封裝性的一個補充,封裝內部約束,避免每次高層調用時都去理解內部約束的實現,也是對內部對內部約束的一個保護
· 橫向擴展容易對象
在上面UML的基礎上我須要增長一個3系列,只須要能加3系列的產品A-3和產品B-3,並增長產品3系列的工廠Product3Factory便可完成擴展
· 產品族的擴展很是困難,即垂直擴展困難,好比說在上面UML的實現的基礎上增長一個額外的產品C,我就須要修改AbstractFactory以及全部它的實現,這徹底不符合開閉原則。blog
一個對象族(或是一組沒有任何關係的對象)都有相同的約束,則能夠使用抽象工廠模式接口
public abstract class AbstractBmwXCar { public abstract void getPrice(); }
public abstract class AbstractBwmXCarKey { public abstract void openCar() ; }
public class BwmX5 extends AbstractBmwXCar { @Override public void getPrice() { System.out.println("我是X5 我要150W"); } }
public class BwmX6 extends AbstractBmwXCar { @Override public void getPrice() { System.out.println("我是X6,我要180W"); } }
public class X5KeyBwmX extends AbstractBwmXCarKey { @Override public void openCar() { System.out.println("我能打開X5的車門"); } }
public class X6KeyBwmX extends AbstractBwmXCarKey { @Override public void openCar() { System.out.println("我能打開X6的車門"); } }
public abstract class AbstractCarFactory { public abstract AbstractBmwXCar createCar(); public abstract AbstractBwmXCarKey createKey(); }
public class X5Factory extends AbstractCarFactory { @Override public BwmX5 createCar() { BwmX5 bwmX5 = new BwmX5(); return bwmX5; } @Override public X5KeyBwmX createKey() { X5KeyBwmX x5Key = new X5KeyBwmX(); return x5Key; } }
public class X6Factory extends AbstractCarFactory { @Override public BwmX6 createCar() { BwmX6 bwmX6 = new BwmX6(); return bwmX6; } @Override public X6KeyBwmX createKey() { X6KeyBwmX x6Key = new X6KeyBwmX(); return x6Key; } }
public class BmwCeo { public static void main(String[] args) { X5Factory x5Factory = new X5Factory(); X6Factory x6Factory = new X6Factory(); BwmX5 x5_1 = x5Factory.createCar(); X5KeyBwmX x5Key = x5Factory.createKey(); BwmX6 x6_1 = x6Factory.createCar(); X6KeyBwmX x6Key = x6Factory.createKey(); // 下面能夠作本身的處理了 } }