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