一、概述
提供一個創建一系列相關或相互依賴對象的接口,而無需指定它們具體的類。
二、為何使用
工廠模式是我們最常用的模式了,著名的Jive論壇 ,就大量使用了工廠模式,工廠模式在Java程序系統可以說是隨處可見。
為什麼工廠模式是如此常用?因為工廠模式就相當於創建實例對象的new,我們經常要根據類Class生成實例對象,如A a=new A() 工廠模式也是用來創建實例對象的,所以以後new時就要多個心眼,是否可以考慮實用工廠模式,雖然這樣做,可能多做一些工作,但會給你係統帶來更大的可擴展性和儘量少的修改量
三、實用性
- 一個系統要獨立於它的產品的創建、組合和表示時。
- 一個系統要由多個產品系列中的一個來配置時。
- 當你要強調一系列相關的產品對象的設計以便進行聯合使用時。
- 當你提供一個產品類庫,而只想顯示它們的接口而不是實現時。
四、參與者
- AbstractFactory 聲明一個創建抽象產品對象的操作接口。
- ConcreteFactory 實現創建具體產品對象的操作。
- AbstractProduct 為一類產品對象聲明一個接口。
- ConcreteProduct 定義一個將被相應的具體工廠創建的產品對象。 實現AbstractProduct接口。
- Client 僅使用由AbstractFactory和AbstractProduct類聲明的接口
五、類圖
六、示例
- AbstractFactory:定義抽象工程類IAnimalFactory
<code>package com.lyz.design.abstractfactory; /** * 這個接口就是類圖中標識的 * AbstractFactory抽象工廠 * @author binghe * */ public interface IAnimalFactory { /** * 定義創建Icat接口實例的方法 * @return */ ICat createCat(); /** * 定義創建IDog接口實例的方法 * @return */ IDog createDog(); }/<code>
WhiteAnimalFactory
<code>package com.lyz.design.abstractfactory; /** * IAnimalFactory抽象工廠的實現類 * @author binghe * */ public class WhiteAnimalFactory implements IAnimalFactory { public ICat createCat() { return new WhiteCat(); } public IDog createDog() { return new WhiteDog(); } }/<code>
BlackAnimalFactory
<code>package com.lyz.design.abstractfactory; /** * IAnimalFactory抽象工廠的實現類 * @author binghe */ public class BlackAnimalFactory implements IAnimalFactory { @Override public ICat createCat() { return new BlackCat(); } public IDog createDog() { return new BlackDog(); } }/<code>
- AbstractProduct: 定義抽象工廠中要生產的抽象產品接口
ICat
<code>package com.lyz.design.abstractfactory; /** * 類圖中定義的AbstractProduct * 指定工廠生產的產品 * @author binghe * */ public interface ICat { /** * 定義方法 */ void eat(); }/<code>
IDog
<code>package com.lyz.design.abstractfactory; /** * 類圖中定義的AbstractProduct * 指定工廠生產的產品 * @author binghe * */ public interface IDog { /** * 定義方法 */ void eat(); }/<code>
BlackCat
<code>package com.lyz.design.abstractfactory; /** * ICat接口的實現類 * @author binghe * */ public class BlackCat implements ICat { @Override public void eat() { System.out.println("The black cat is eating!"); } }/<code>
BlackDog
<code>package com.lyz.design.abstractfactory; /** * IDog的實現類 * @author binghe */ public class BlackDog implements IDog { @Override public void eat() { System.out.println("The black dog is eating"); } }/<code>
WhiteCat
<code>package com.lyz.design.abstractfactory; /** * ICat的實現類 * @author binghe * */ public class WhiteCat implements ICat { @Override public void eat() { System.out.println("The white cat is eating!"); } }/<code>
WhiteDog
<code>package com.lyz.design.abstractfactory; /** * IDog的實現類 * @author binghe * */ public class WhiteDog implements IDog { @Override public void eat() { System.out.println("The white dog is eating!"); } }/<code>
- Client:定義一個測試類Test
<code>package com.lyz.design.abstractfactory; /** * 測試類 * @author binghe * */ public class Test { public static void main(String[] args) { IAnimalFactory blackAnimalFactory = new BlackAnimalFactory(); ICat blackCat = blackAnimalFactory.createCat(); blackCat.eat(); IDog blackDog = blackAnimalFactory.createDog(); blackDog.eat(); IAnimalFactory whiteAnimalFactory = new WhiteAnimalFactory(); ICat whiteCat = whiteAnimalFactory.createCat(); whiteCat.eat(); IDog whiteDog = whiteAnimalFactory.createDog(); whiteDog.eat(); } }/<code>
- 輸出結果
<code>The black cat is eating! The black dog is eating The white cat is eating! The white dog is eating!/<code>
七、總結
由此可見,工廠方法確實為系統結構提供了非常靈活強大的動態擴展機制,只要我們更換一下具體的工廠方法,系統其他地方無需一點變換,就有可能將系統功能進行改頭換面的變化