- 一、什麼是工廠方法模式?
工廠方法模式同樣屬於類的創建型模式又被稱爲多態工廠模式 。工廠方法模式的意義是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成爲一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
- 二、模式中包含的角色及其職責1.抽象工廠(Creator)角色 工廠方法模式的核心,任何工廠類都必須實現這個接口。2.具體工廠( Concrete Creator)角色 具體工廠類是抽象工廠的一個實現,負責實例化產品對象。3.抽象(Product)角色 工廠方法模式所創建的所有對象的父類,它負責描述所有實例所共有的公共接口。4.具體產品(Concrete Product)角色 工廠方法模式所創建的具體實例對象
- 三、工廠方法模式和簡單工廠模式比較工廠方法模式與簡單工廠模式在結構上的不同不是很明顯。工廠方法類的核心是一個抽象工廠類,而簡單工廠模式把核心放在一個具體類上。工廠方法模式之所以有一個別名叫多態性工廠模式是因爲具體工廠類都有共同的接口,或者有共同的抽象父類。 當系統擴展需要添加新的產品對象時,僅僅需要添加一個具體對象以及一個具體工廠對象,原有工廠對象不需要進行任何修改,也不需要修改客戶端,很好的符合了“開放-封閉”原則。而簡單工廠模式在添加新產品對象後不得不修改工廠方法,擴展性不好。 工廠方法模式退化後可以演變成簡單工廠模式。
- 代碼實現:抽象角色類:Fruit[java]package com.qianyan.product;public interface Fruit {/*** 採集*/public void get();}具體角色類:Apple、Banana[java]package com.qianyan.bean;import com.qianyan.product.Fruit;public class Apple implements Fruit{/*** 採集*/public void get(){System.out.println("採集蘋果!");}}[java]package com.qianyan.bean;import com.qianyan.product.Fruit;public class Banana implements Fruit{/*** 採集*/public void get(){System.out.println("採集香蕉!");}}抽象工廠類:[java]package com.qianyan.factory;import com.qianyan.product.Fruit;/*** 抽象工廠類* @author hadoop**/public interface FruitFactory {public Fruit getFruit();}工廠的實現類:[java]package com.qianyan.factory.impl;import com.qianyan.bean.Apple;import com.qianyan.factory.FruitFactory;import com.qianyan.product.Fruit;public class AppleFactory implements FruitFactory{@Overridepublic Fruit getFruit() {return new Apple();}}[java]package com.qianyan.factory.impl;import com.qianyan.bean.Banana;import com.qianyan.factory.FruitFactory;import com.qianyan.product.Fruit;public class BananaFactory implements FruitFactory{@Overridepublic Fruit getFruit() {return new Banana();}}顧客類:[java]package com.qianyan.user;import com.qianyan.factory.FruitFactory;import com.qianyan.factory.impl.AppleFactory;import com.qianyan.factory.impl.BananaFactory;import com.qianyan.product.Fruit;public class Customer {public static void main(String[] args) throws Exception {//獲得AppleFactoryFruitFactory f1 = new AppleFactory();//通過AppleFactory來獲取Apple實例對象Fruit apple = f1.getFruit();apple.get();//獲得BananaFactoryFruitFactory f2 = new BananaFactory();//通過BananaFactory來獲取Banana實例對象Fruit banana = f2.getFruit();banana.get();}}測試結果:[java]採集蘋果!採集香蕉!