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