我的Java設計模式-工廠方法模式

Jet啟思發表於2017-09-20

女朋友dodo鬧脾氣,氣勢洶洶的說“我要吃雪糕”。筆者心裡啊樂滋滋的,一支雪糕就能哄回來,不亦樂乎?!

雪糕買回來了,她說“不想吃雪糕了,突然想吃披薩”。呵呵了,憋了一股勁“沒問題”,又屁顛屁顛的去把披薩買回來。

世事難料,dodo同學又放大招了,“披薩太上火了,我要吃芝士蛋糕”。

這時候,工廠方法模式該上場了,使用它可以完美的解決不斷的產品變更。工廠方法模式是怎麼樣的?而工廠方法模式又是怎樣解決產品變更呢?一起來看看...

一、工廠方法模式

定義

定義一個建立物件的工廠介面,工廠方法將例項化推遲到子類中。

定義總是抽象的,先放出工廠方法模式的UML圖如下所示:

工廠模式UML.png
工廠模式UML.png

從上圖可以看出,工廠方法模式涉及到以下四個角色的概念:

- 抽象工廠角色:工廠方法模式的核心,建立產品的工廠類必須實現該介面。

- 具體工廠角色:該角色實現了抽象工廠介面,具體如何建立產品類就是在該實現類完成。

- 抽象產品角色:所有產品類的超類,負責實現產品共性的抽象定義。

- 具體產品角色:該角色實現了抽象產品介面,負責具體的不同產品業務邏輯。

二、實戰

上程式碼

抽象工廠角色程式碼如下:

public interface Factory {

    // 傳入引數的是產品型別,這裡返回產品類的抽象工廠類Product    
    public Product factory(String productType);

}
複製程式碼

這裡做出生產雪糕、披薩的工廠,有了工廠才能生產對應的產品,具體工廠角色程式碼如下:

// 雪糕的工廠,負責生產雪糕
public class IceCreamFactory implements Factory {

    @Override
    public Product factory() {
        return new IceCream();
    }

}
複製程式碼

上面看到抽象角色Product,看程式碼:

public interface Product {

    public void product();

}
複製程式碼

具體角色程式碼如下:

public class IceCream implements Product {

    @Override
    public void product() {

        /**
         *  具體的業務邏輯
         */
        System.out.println("雪糕做好了!!");
    }

}
複製程式碼

OK,涉及到工廠方式模式系統的程式碼基本完成,下面看看客戶端怎麼使用工廠模式,雪糕準備就緒:

public class Client {

    public static void main(String[] args){

        // 生產雪糕
        Factory iceCreamFactory = new IceCreamFactory();
        Product iceCream = iceCreamFactory.factory();
        iceCream.product();

    }

}
複製程式碼

執行客戶端程式碼,結果如下:

雪糕做好了!!

擴充套件

雪糕的order已經完成!雪糕不吃,吃披薩?OK,現在就做披薩。同樣的先實現抽象工廠和抽象產品角色。

披薩工廠實現如下:

// 披薩的工廠,負責生產披薩
public class PizzaFactory implements Factory {

    @Override
    public Product factory() {
        return new Pizza();
    }

}
複製程式碼

接下來就是披薩:

public class Pizza implements Product {

    @Override
    public void product() {
        /**
         *  具體的業務邏輯
         */
        System.out.println("披薩做好了!!");
    }

}
複製程式碼

現在我們在客戶端中實現生產披薩,程式碼如下:

public class Client {

    public static void main(String[] args){

        // 生產雪糕
        Factory iceCreamFactory = new IceCreamFactory();
        Product iceCream = iceCreamFactory.factory();
        iceCream.product();

        // 生產披薩
        Factory pizzaFactory = new PizzaFactory();
        Product pizza = pizzaFactory.factory();
        pizza.product();
    }

}
複製程式碼

執行結果如下:

雪糕做好了!!

披薩做好了!!

三、工廠方法模式的優缺點

優點

1)優秀的擴充套件性。假如披薩不想吃了,想吃芝士蛋糕,只需要增加芝士蛋糕的具體工廠和具體產品類,不會影響其他產品的生產。

2)大降低程式碼的耦合度,客戶端最終得到的是產品本身,而不需要知道和操作產品的生產過程。

缺點

1)增加新產品時,需要增加具體的工廠類和具體的產品類,當產品數量多的時候就會造成系統的複雜度增大,也增加了對系統理解的難度。

四、比較

跟策略模式對比:問得最多的一個問題。工廠方法模式和策略的模式有什麼區別?區別在於,策略模式強調的是提供不同的策略方案,而工廠方法模式強調的是產品本身。

策略模式接下來也會說到,把策略模式吃透了,回頭再跟工廠方法模式對比的時候就恍然大悟了。

總結

首先,上一篇的單例模式很多人都給我提了很不錯的建議,也在這篇文章中改進了。工廠方式模式的使用率也非常高,掌握它對把握系統架構會有比較大的提升。下一篇要分享的是:建造者模式


相關文章