【重溫23種設計模式】之工廠方法模式
來源:mikechen的網際網路架構
工廠方法模式是 簡單工廠模式 的進一步抽象和升級,使用頻次也更高。
工廠方法模式實現了可擴充套件,同時滿足開閉原則,解決了簡單工廠模式每次新增新的產品時,都需要修改工廠類的問題。
今天,我們主要了解工廠方法模式。
大家好,我是mikechen。本文是《深入淺出設計模式》的第 10 篇。剛結束的設計模式系列篇:七大設計原則(2萬+字、40多張圖解),大家反響還不錯。
為方便學習,我已將全部內容更新到《深入淺出設計模式》PDF 了,該PDF目前有 2+萬字,50+張圖解,80多頁,內容涵蓋設計模式的 7 大原則、23 種設計模式。圖文並茂非常詳細,夯實基礎、複習備面都用得上,需要的同學文末自取。
工廠方法模式( Factory method pattern),又稱為工廠模式。
工廠方法模式定義工廠父類負責定義建立物件的公共介面,而子類則負責生成具體的物件。
工廠方法模式的特點是:構建的都是同一型別的物件(實現相同的介面);且每一類物件對應一個工廠。
工廠方法模式的 UML類圖
工廠方法模式的 4 個重要角色包括抽象工廠、具體工廠、抽象產品、具體產品。
Product:抽象產品類。
ConcreteProduct:具體產品類,實現Product介面。
Factory:抽象工廠類,該方法返回一個Product型別的物件。
ConcreteFactory:具體工廠類,返回ConcreteProduct例項。
工廠方法模式是簡單工廠模式的進一步抽象和升級,它解決了簡單工廠模式每當新增新的產品品類的時候,都需要修改工廠類的問題。
在沒有引入工廠方法模式前,我們每次需要增加一種產品,就需要去修改工廠類的方法邏輯,這就違背了開閉原則,不易形成高內聚、松耦合的結構,維護非常麻煩。
工廠方法模式可以在不修改原來程式碼的情況下,讓系統引進新的產品,即滿足開閉原則。
這裡我們依然沿用《秒懂簡單工廠模式》中手機產品的例子。
原始碼示例:
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圖就更加容易理解了:
優點:
靈活性增強:對於新產品的建立,只需多寫一個相應的工廠類。
典型的解耦框架:高層模組只需要知道產品的抽象類,無須關心其他實現類。
缺點:
系統的複雜度增加:新增新產品時,需要增加新產品類,同時提供與之對應的具體工廠類,系統類的個數將成對增加。
一個具體工廠只能建立一種具體產品,如果要更換另外一種產品,仍然需要修改例項化的具體工廠類。
當一個類不知道它所需要的物件的類時;
當一個類希望透過其子類來指定建立物件時。
工廠方法模式與簡單工廠模式的區別:
工廠方法模式:客戶端不知道它所需要的物件的類,抽象工廠類透過其子類來指定建立哪個物件,不違背開閉原則。
簡單工廠模式:在工廠類中包含了必要的邏輯判斷,根據不同的條件、來動態例項化相關的類,違背了開閉原則。
仍以生產手機為例,假設我們需要生產蘋果手機。
工廠方法模式:只需要直接建立產品,不需要去修改工廠類。
簡單工廠模式:需要在工廠類中再新增一個 Case 分支條件,這違背了開閉原則,因為對修改也開放了。
對開閉原則還不太理解的同學,看這篇:設計模式七大原則最全總結 。
透過本文,我們瞭解並掌握了工廠方法模式的所有核心知識,包括工廠方法模式的概念、原理、應用場景、實現等。
工廠方法模式體現了面向介面程式設計的思路,它並不是簡單把 New 的過程換成了函式,而是抽象出一套面向介面的設計模式。
工廠方法模式在保留簡單工廠模式的封裝優點的同時,讓擴充套件變得更加簡單,讓繼承變得可行,增加了多型性的體現。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70024923/viewspace-2996094/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【重溫設計模式】之003工廠方法模式設計模式
- 23種設計模式之工廠方法模式設計模式
- 工廠方法模式GoF23種設計模式之建立型模式之工廠方法模式Go設計模式
- 23種設計模式之抽象工廠模式設計模式抽象
- 23種設計模式之抽象工廠設計模式抽象
- 23種設計模式(抽象工廠模式)設計模式抽象
- java23種設計模式之抽象工廠模式Java設計模式抽象
- 設計模式之工廠方法模式|抽象工廠模式設計模式抽象
- 重溫23種設計模式(11):原型模式設計模式原型
- 設計模式之工廠方法模式設計模式
- Java 設計模式之工廠方法模式與抽象工廠模式Java設計模式抽象
- java23種設計模式——三、工廠模式Java設計模式
- Java設計模式之工廠方法模式Java設計模式
- golang設計模式之工廠方法模式Golang設計模式
- 設計模式系列之「工廠方法模式」設計模式
- 23種設計模式(一)---簡單工廠設計模式設計模式
- 設計模式之工廠模式!深入解析簡單工廠模式,工廠方法模式和抽象工廠模式設計模式抽象
- 設計模式之工廠方法設計模式
- 設計模式-工廠模式二(工廠方法模式)設計模式
- Java常用設計模式之工廠方法模式Java設計模式
- 設計模式之工廠方法模式(FACTORY METHOD)設計模式
- 設計模式 - 工廠方法模式設計模式
- 設計模式-工廠方法模式設計模式
- 設計模式~~~工廠方法模式設計模式
- 設計模式——工廠方法模式設計模式
- 【設計模式】工廠方法模式設計模式
- 設計模式-簡單工廠、工廠方法模式、抽象工廠模式設計模式抽象
- 設計模式之工廠模式設計模式
- 設計模式之【工廠模式】設計模式
- 設計模式:三種工廠模式設計模式
- Typescript 設計模式之工廠方法TypeScript設計模式
- 設計模式之-工廠方法-FactoryMethod設計模式
- 重學 Java 設計模式:實戰工廠方法模式Java設計模式
- 23種設計模式之--模板方法模式設計模式
- 23種設計模式之模版方法模式設計模式
- 嘻哈說:設計模式之工廠方法模式設計模式
- 設計模式系列·工廠方法模式之Code Review設計模式View
- android常用設計模式之工廠方法模式Android設計模式