【重溫23種設計模式】之工廠方法模式

張哥說技術發表於2023-11-20

來源:mikechen的網際網路架構

工廠方法模式 簡單工廠模式 的進一步抽象和升級,使用頻次也更高。

工廠方法模式實現了可擴充套件,同時滿足開閉原則,解決了簡單工廠模式每次新增新的產品時,都需要修改工廠類的問題。

【重溫23種設計模式】之工廠方法模式

今天,我們主要了解工廠方法模式。

【重溫23種設計模式】之工廠方法模式

大家好,我是mikechen。本文是《深入淺出設計模式》的第 10 篇。剛結束的設計模式系列篇:七大設計原則(2萬+字、40多張圖解),大家反響還不錯。

為方便學習,我已將全部內容更新到《深入淺出設計模式》PDF 了,該PDF目前有 2+萬字,50+張圖解,80多頁,內容涵蓋設計模式的 7 大原則、23 種設計模式。圖文並茂非常詳細,夯實基礎、複習備面都用得上,需要的同學文末自取。

【重溫23種設計模式】之工廠方法模式

01
  工廠方法模式的定義

工廠方法模( Factory method pattern),又稱為工廠模式。

工廠方法模式定義工廠父類負責定義建立物件的公共介面,而子類則負責生成具體的物件。

工廠方法模式的特點是:構建的都是同一型別的物件(實現相同的介面);且每一類物件對應一個工廠。

02
  工廠方法模式的結構

工廠方法模式的 UML類圖

【重溫23種設計模式】之工廠方法模式

工廠方法模式的 4 個重要角色包括象工廠、具體工廠、抽象產品、具體產品。

【重溫23種設計模式】之工廠方法模式

  • Product:抽象產品類。

  • ConcreteProduct:具體產品類,實現Product介面。

  • Factory:抽象工廠類,該方法返回一個Product型別的物件。

  • ConcreteFactory:具體工廠類,返回ConcreteProduct例項。


03
  工廠方法模式解決問題

工廠方法模式簡單工廠模式的進一步抽象和升級,它解決了簡單工廠模式每當新增新的產品品類的時候,都需要修改工廠類的問題。

在沒有引入工廠方法模式前,我們每次需要增加一種產品,就需要去修改工廠類的方法邏輯,這就違背了開閉原則,不易形成高內聚、松耦合的結構,維護非常麻煩。

工廠方法模式可以在不修改原來程式碼的情況下,讓系統引進新的產品,即滿足開閉原則。

04
  工廠方法模式的實現

這裡我們依然沿用《秒懂簡單工廠模式》中手機產品的例子。

原始碼示例:

1)建立抽象產品

手機的產品類,有一個 start 方法用於手機啟動:






package com.mikechen.java.design.factory.simple;
public abstract class Phone{    public abstract void start();}

2)建立具體產品

具體的電腦產品分別是華為、小米和蘋果手機.

華為手機:










package com.mikechen.java.design.factory.simple;

public class HuaWeiPhone extends Phone{    @Override    public void start() {        System.out.println("華為手機啟動");    }}


小米手機:









package com.mikechen.java.design.factory.simple;
public class XiaoMiPhone extends Phone{    @Override    public void start() {        System.out.println("小米手機啟動");    }}


蘋果手機:









package com.mikechen.java.design.factory.simple;
public class IPhone extends Phone{    @Override    public void start() {        System.out.println("蘋果手機啟動");    }}

3)建立抽象工廠

其中,有一個 createPhone 方法,我們想要生產哪個品牌的手機,就生產哪個:






package com.mikechen.java.design.factory.simple;
public abstract class PhoneFactory {    public abstract <T extends Phone> T createPhone(Class<T> clz);}

4)具體工廠

假設位於深圳的華強北是一個具體的工廠,它繼承抽象工廠,透過反射來生產不同廠家的手機:





















package com.mikechen.java.design.factory.simple;
/** * 深圳華強北工廠 */public class HQBPhoneFactor extends PhoneFactory {    @Override    public <T extends Phone> T createPhone(Class<T> clz) {        Phone phone=null;        String classname=clz.getName();
       try {            //透過反射來生產不同廠家的電腦            Phone= (Phone) Class.forName(classname).newInstance();        } catch (Exception e) {            e.printStackTrace();        }        return (T) Phone;    }}

客戶端呼叫














package com.mikechen.java.design.factory.simple;
public class Client {    public static void main(String[]args) {        PhoneFactory phoneFactory = new HQBPhoneFactor();        HuaWeiPhone mHuaWeiPhone=phoneFactory.createphone(HuaWeiPhone.class);        mHuaWeiPhone.start();        XiaoMiHuaWeiPhone mXiaoMiHuaWeiPhone=PhoneFactory.createPhone(XiaoMiHuaWeiPhone.class);        mXiaoMiHuaWeiPhone.start();        IphoneComputer mIPhone=PhoneFactory.createphone(Iphone.class);        mIphone.start();    }}

結構很簡單,看看下面的UML圖就更加容易理解了:

【重溫23種設計模式】之工廠方法模式

05
  工廠方法模式的優缺點

優點:

  • 靈活性增強:對於新產品的建立,只需多寫一個相應的工廠類。

  • 典型的解耦框架:高層模組只需要知道產品的抽象類,無須關心其他實現類。


點:

  • 系統的複雜度增加新增新產品時,需要增加新產品類,同時提供與之對應的具體工廠類,系統類的個數將成對增加。

  • 一個具體工廠只能建立一種具體產品,如果要更換另外一種產品,仍然需要修改例項化的具體工廠類。


06
  工廠方法模式的應用場景

  • 當一個類不知道它所需要的物件的類時; 

  • 當一個類希望透過其子類來指定建立物件時。 


07
  與簡單工廠模式的區別

廠方法模式與簡單工廠模式的區別

  • 工廠方法模式:客戶端不知道它所需要的物件的類,抽象工廠類透過其子類來指定建立哪個物件,不違背開閉原則。

  • 簡單工廠模式:在工廠類中包含了必要的邏輯判斷,根據不同的條件、來動態例項化相關的類,違背了開閉原則。


仍以生產手機為例,假設我們需要生產蘋果手機。

  • 工廠方法模式:只需要直接建立產品,不需要去修改工廠類。

  • 簡單工廠模式:需要在工廠類中再新增一個 Case 分支條件,這違背了開閉原則,因為對修改也開放了。

開閉原則還不太理解的同學,看這篇設計模式七大原則最全總結 


總結


透過本文,我們瞭解並掌握了工廠方法模式的所有核心知識,包括工廠方法模式的概念、原理、應用場景、實現等

工廠方法模式體現了面向介面程式設計的思路,它並不是簡單把 New 的過程換成了函式,而是抽象出一套面向介面的設計模式。

工廠方法模式在保留簡單工廠模式的封裝優點的同時,讓擴充套件變得更加簡單,讓繼承變得可行,增加了多型性的體現。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024923/viewspace-2996094/,如需轉載,請註明出處,否則將追究法律責任。

相關文章