定義:java
抽象工廠模式提供一個接口,用於建立相關或者依賴對象的家族,而不須要明確指定具體類。ide
抽象工廠容許客戶端使用抽象的接口來建立一組相關的產品,而不須要關係實際產出的具體產品是什麼。這樣一來,客戶就能夠從具體的產品中被解耦。ui
示例代碼:設計
Fruit.java對象
package com.designPattern.abstractFactory; /*** * * @author liuzhihu * */ public interface Fruit { /*** * 定義吃水果的方法 */ public void eatFruit(); }
Apple.javablog
package com.designPattern.abstractFactory; /*** * * @author liuzhihu * */ public abstract class Apple implements Fruit { public abstract void eatFruit(); }
Banana.java接口
package com.designPattern.abstractFactory; /*** * * @author liuzhihu * */ public abstract class Banana implements Fruit { public abstract void eatFruit(); }
NorthApple.javaget
package com.designPattern.abstractFactory; public class NorthApple extends Apple { @Override public void eatFruit() { System.out.println("吃北方蘋果。。。。。。"); } }
NorthBanana.java產品
package com.designPattern.abstractFactory; public class NorthBanana extends Banana { @Override public void eatFruit() { System.out.println("吃北方香蕉。。。。。。"); } }
SouthApple.javait
package com.designPattern.abstractFactory; public class SouthApple extends Apple { @Override public void eatFruit() { System.out.println("吃南方蘋果。。。。。。"); } }
SouthBanana.java
package com.designPattern.abstractFactory; public class SouthBanana extends Banana { @Override public void eatFruit() { System.out.println("吃南方香蕉。。。。。。"); } }
FruitFactory.java
package com.designPattern.abstractFactory; public abstract class FruitFactory { /*** * 採集水果 * * @param type * @return */ public abstract Fruit getFruit(String type); }
NorthFruitFactory.java
package com.designPattern.abstractFactory; public class NorthFruitFactory extends FruitFactory { @Override public Fruit getFruit(String type) { if ("Apple".equals(type)) { return new NorthApple(); } else if ("Banana".equals(type)) { return new NorthBanana(); } else { System.out.println("找不到對應的水果......"); return null; } } }
SouthFruitFactory.java
package com.designPattern.abstractFactory; public class SouthFruitFactory extends FruitFactory { @Override public Fruit getFruit(String type) { if ("Apple".equals(type)) { return new SouthApple(); } else if ("Banana".equals(type)) { return new SouthBanana(); } else { System.out.println("找不到對應的水果......"); return null; } } }
MainTest.java
package com.designPattern.abstractFactory; public class MainTest { public static void main(String[] args) { // 北方水果 NorthFruitFactory northFruitFactory = new NorthFruitFactory(); Fruit northApple = northFruitFactory.getFruit("Apple"); northApple.eatFruit(); Fruit northBanana = northFruitFactory.getFruit("Banana"); northBanana.eatFruit(); // 南方水果 SouthFruitFactory southFruitFactory = new SouthFruitFactory(); Fruit southApple = southFruitFactory.getFruit("Apple"); southApple.eatFruit(); Fruit southBanana = southFruitFactory.getFruit("Banana"); southBanana.eatFruit(); } }
優勢
一、 抽象工廠隔離了具體類的生成,是的客戶端不須要知道什麼被建立。全部的具體工廠都實現了抽象工廠中定義的公共接口,所以只須要改變具體工廠的實例,就能夠在某種程度上改變整個軟件系統的行爲。
二、 當一個產品族中的多個對象被設計成一塊兒工做時,它可以保證客戶端始終只使用同一個產品族中的對象。
缺點
添加新的行爲時比較麻煩。若是須要添加一個新產品族對象時,須要更改接口及其下全部子類,這必然會帶來很大的麻煩。