Java设计模式-工厂模式(2)工厂方法模式
在Java設計模式-工廠模式(1)簡單工廠模式 中我們介紹了簡單工廠模式,提到了簡單工廠模式違背了開閉原則,而“工廠方法模式”是對簡單工廠模式的進一步抽象化,其好處是可以使系統在不修改原來代碼的情況下引進新的產品,即滿足開閉原則。
地點: 湖南永州市藍山縣舜河村
作者:用心笑* 😁
Java設計模式-工廠模式(2)工廠方法模式
- 一、前言
- 1)概述:
- 2)角色結構:
- 3)類圖關系:
- 二、代碼實現
- 1)Coffce咖啡抽象類(產品抽象類)
- 2)AmericanCoffee 、LatteCoffee類(具體產品類)
- 3)CoffeeFactory(抽象工廠類)
- 4)AmericanCoffeeFactory、LatteCoffeeFactory類 (具體實現工廠)
- 5)咖啡店(用具體產品的客戶)
- 6)測試
- 三、總結
- 3.1、小結:
- 3.2、優點:
- 3.3、缺點:
- 3.4、應用場景:
- 四、自言自語
一、前言
1)概述:
工廠方法(Factory Method)模式的意義是定義一個創建產品對象的工廠接口,將實際創建工作推遲到子類當中。核心工廠類不再負責產品的創建,這樣核心類成為一個抽象工廠角色,僅負責具體工廠子類必須實現的接口,這樣進一步抽象化的好處是使得工廠方法模式可以使系統在不修改具體工廠角色的情況下引進新的產品。
工廠方法模式是簡單工廠模式的衍生,解決了許多簡單工廠模式的問題。首先完全實現‘開-閉 原則’,實現了可擴展。其次更復雜的層次結構,可以應用于產品結果復雜的場合。
工廠方法模式對簡單工廠模式進行了抽象。有一個抽象的Factory類(可以是抽象類和接口),這個類將不再負責具體的產品生產,而是只制定一些規范,具體的生產工作由其子類去完成。在這個模式中,工廠類和產品類往往可以依次對應。即一個抽象工廠對應一個抽象產品,一個具體工廠對應一個具體產品,這個具體的工廠就負責生產對應的產品。
2)角色結構:
抽象工廠(Creator):是工廠方法模式的核心,與應用程序無關。任何在模式中創建的對象的工廠類必須實現這個接口。
具體工廠(Concrete Creator):這是實現抽象工廠接口的具體工廠類,包含與應用程序密切相關的邏輯,并且受到應用程序調用以創建產品對象。在上圖中有兩個這樣的角色:BulbCreator與TubeCreator。
抽象產品(Product):工廠方法模式所創建的對象的超類型,也就是產品對象的共同父類或共同擁有的接口。在上圖中,這個角色是Light。
具體產品(Concrete Product):這個角色實現了抽象產品角色所定義的接口。某具體產品有專門的具體工廠創建,它們之間往往一一對應。
博主自語: 說人話就是往上再抽取一層(所以果然是沒有什么是加一層不能解決的,一層不行就加兩層)😁
還是上次那個問題:
需求:設計一個咖啡店點餐系統。
設計一個咖啡類(Coffee),并定義其兩個子類(美式咖啡【AmericanCoffee】和拿鐵咖啡【LatteCoffee】);再設計一個咖啡店類(CoffeeStore),咖啡店具有點咖啡的功能。
3)類圖關系:
上一文中的簡單工廠類圖:
工廠方法類圖:
之前在簡單工廠模式中,CoffeeStore和SimpleCoffeeFactory工廠直接進行關聯,那個時候在SimpleCoffeeFactory簡單工廠中還需要做一些具體的操作,但是在這里再次進行了一個抽取,將工廠分為了兩層,一是抽象工廠,二是具體的實現工廠。再一次做了一個解耦操作。
想了解簡單工廠模式點👉Java設計模式-工廠模式(1)簡單工廠模式
具體還是看代碼實現吧,在看文末比較總結吧😁
二、代碼實現
1)Coffce咖啡抽象類(產品抽象類)
public abstract class Coffee {public abstract void addMilk();public abstract void addSugar();public abstract String getName(); }2)AmericanCoffee 、LatteCoffee類(具體產品類)
public class AmericanCoffee extends Coffee {@Overridepublic void addMilk() { System.out.println("給咖啡加奶"); }@Overridepublic void addSugar() { System.out.println("給咖啡加糖"); }@Overridepublic String getName() { return "美式咖啡"; } } public class LatteCoffee extends Coffee {@Overridepublic void addMilk() { System.out.println("給咖啡加奶"); }@Overridepublic void addSugar() { System.out.println("給咖啡加糖"); }@Overridepublic String getName() { return "拿鐵咖啡"; } }3)CoffeeFactory(抽象工廠類)
public interface CoffeeFactory {Coffee createCoffee(); }4)AmericanCoffeeFactory、LatteCoffeeFactory類 (具體實現工廠)
public class AmericanCoffeeFactory implements CoffeeFactory {@Overridepublic Coffee createCoffee() { return new AmericanCoffee(); } } public class LatteCoffeeFactory implements CoffeeFactory {@Overridepublic Coffee createCoffee() { return new LatteCoffee(); } }5)咖啡店(用具體產品的客戶)
public class CoffeeStore {private CoffeeFactory factory;public CoffeeStore(CoffeeFactory factory) { this.factory = factory; }public Coffee orderCoffee(String type) {Coffee coffee = factory.createCoffee();coffee.addMilk();coffee.addSugar();return coffee;} }6)測試
我們現在來測試一下
public class Client {public static void main(String[] args) {CoffeeStore coffeeStore = new CoffeeStore(new AmericanCoffeeFactory());Coffee americano = coffeeStore.orderCoffee("americano");System.out.println(americano.getName());/*** 給咖啡加奶* 給咖啡加糖* 美式咖啡*/} }三、總結
3.1、小結:
從上面的代碼來看,這完美的解決了簡單工廠方法中所違背的”開閉原則“,在這里如果需要再增加新的產品,只需要再寫一個具體的實現工廠類就可以了,而不需要對原代碼進行修改。
工廠方法模式是簡單工廠模式的進一步抽象。由于使用了多態性,工廠方法模式保持了簡單工廠模式的優點,而且克服了它的缺點。
3.2、優點:
- 用戶只需要知道具體工廠的名稱就可得到所要的產品,無須知道產品的具體創建過程。
- 靈活性增強,對于新產品的創建,只需多寫一個相應的具體工廠類。無須對原工廠進行任何修改,滿足開閉原則
- 典型的解耦框架。高層模塊只需要知道產品的抽象類,無須關心其他實現類,滿足迪米特法則、依賴倒置原則和里氏替換原則。
3.3、缺點:
- 類的個數容易過多,增加復雜度
- 增加了系統的抽象性和理解難度
- 抽象產品只能生產一種產品,此弊端可使用抽象工廠模式解決。(下一篇文章😀持續更新中)
3.4、應用場景:
- 客戶只知道創建產品的工廠名,而不知道具體的產品名。如 TCL 電視工廠、海信電視工廠等。
- 創建對象的任務由多個具體子工廠中的某一個完成,而抽象工廠只提供創建產品的接口。
- 客戶不關心創建產品的細節,只關心產品的品牌
四、自言自語
我也不知道文章寫出來是有用還是無用,只是想做一個分享。希望大家能夠喜歡并且在這里能有收獲。
你好啊,要天天開心哦。下篇文章再見。
此系列還在持續更新中…👉 我一定還會回來的。😁
總結
以上是生活随笔為你收集整理的Java设计模式-工厂模式(2)工厂方法模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java设计模式-工厂模式(1)简单工厂
- 下一篇: Java设计模式-工厂模式(3)抽象工厂