女朋友dodo鬧脾氣,氣勢洶洶的說“我要吃雪糕”。筆者心裡啊樂滋滋的,一支雪糕就能哄回來,不亦樂乎?!
雪糕買回來了,她說“不想吃雪糕了,突然想吃披薩”。呵呵了,憋了一股勁“沒問題”,又屁顛屁顛的去把披薩買回來。
世事難料,dodo同學又放大招了,“披薩太上火了,我要吃芝士蛋糕”。
這時候,工廠方法模式該上場了,使用它可以完美的解決不斷的產品變更。工廠方法模式是怎麼樣的?而工廠方法模式又是怎樣解決產品變更呢?一起來看看...
一、工廠方法模式
定義
定義一個建立物件的工廠介面,工廠方法將例項化推遲到子類中。
定義總是抽象的,先放出工廠方法模式的UML圖如下所示:
從上圖可以看出,工廠方法模式涉及到以下四個角色的概念:
- 抽象工廠角色:工廠方法模式的核心,建立產品的工廠類必須實現該介面。
- 具體工廠角色:該角色實現了抽象工廠介面,具體如何建立產品類就是在該實現類完成。
- 抽象產品角色:所有產品類的超類,負責實現產品共性的抽象定義。
- 具體產品角色:該角色實現了抽象產品介面,負責具體的不同產品業務邏輯。
二、實戰
上程式碼
抽象工廠角色程式碼如下:
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)增加新產品時,需要增加具體的工廠類和具體的產品類,當產品數量多的時候就會造成系統的複雜度增大,也增加了對系統理解的難度。
四、比較
跟策略模式對比:問得最多的一個問題。工廠方法模式和策略的模式有什麼區別?區別在於,策略模式強調的是提供不同的策略方案,而工廠方法模式強調的是產品本身。
策略模式接下來也會說到,把策略模式吃透了,回頭再跟工廠方法模式對比的時候就恍然大悟了。
總結
首先,上一篇的單例模式很多人都給我提了很不錯的建議,也在這篇文章中改進了。工廠方式模式的使用率也非常高,掌握它對把握系統架構會有比較大的提升。下一篇要分享的是:建造者模式