個人Java設計模式-工廠方法模式

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

雪糕買回來了,她說「不想吃雪糕了,忽然想吃披薩」。呵呵了,憋了一股勁「沒問題」,又屁顛屁顛的去把披薩買回來。架構

世事難料,dodo同窗又放大招了,「披薩太上火了,我要吃芝士蛋糕」。ide

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

1、工廠方法模式

定義

定義一個建立對象的工廠接口,工廠方法將實例化推遲到子類中。ui

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

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

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

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

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

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

- 具體產品角色:該角色實現了抽象產品接口,負責具體的不一樣產品業務邏輯。

2、實戰

上代碼

抽象工廠角色代碼以下:

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();
    }

}
複製代碼

運行結果以下:

雪糕作好了!!

披薩作好了!!

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

優勢

1)優秀的擴展性。假如披薩不想吃了,想吃芝士蛋糕,只須要增長芝士蛋糕的具體工廠和具體產品類,不會影響其餘產品的生產。

2)大下降代碼的耦合度,客戶端最終獲得的是產品自己,而不須要知道和操做產品的生產過程。

缺點

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

4、比較

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

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

總結

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

相關文章
相關標籤/搜索