设计模式——工厂模式(二)
文章目錄
- 工廠方法模式
- 1.1工廠方法模式概述
- 1.2工廠方法模式定義如下
- 1.3工廠方法模式要點
- 1.4設計步驟及代碼示例
- 1.5工廠方法模式結構圖中包含角色
- 1.6工廠方法模式的主要優點和缺點
- 1.7工廠方法模式總結
工廠方法模式
1.1工廠方法模式概述
在簡單工廠模式中只提供一個工廠類,該工廠類處于對產品類進行實例化的中心位置,它需要知道每一個產品對象的創建細節,并決定何時實例化哪一個產品類。簡單工廠模式最大的缺點是當有新產品要加入到系統中時,必須修改工廠類,需要在其中加入必要的業務邏輯,這違背了“開閉原則”。此外,在簡單工廠模式中,所有的產品都由同一個工廠創建,工廠類職責較重,業務邏輯較為復雜,具體產品與工廠類之間的耦合度高,嚴重影響了系統的靈活性和擴展性,而工廠方法模式則可以很好地解決這一問題。
在工廠方法模式中,我們不再提供一個統一的工廠類來創建所有的產品對象,而是針對不同的產品提供不同的工廠,系統提供一個與產品等級結構對應的工廠等級結構。
1.2工廠方法模式定義如下
工廠方法模式(Factory Method Pattern):定義一個用于創建對象的接口,讓子類決定將哪一個類實例化。工廠方法模式讓一個類的實例化延遲到其子類。工廠方法模式又簡稱為工廠模式(Factory Pattern),又可稱作虛擬構造器模式(Virtual Constructor Pattern)或多態工廠模式(Polymorphic Factory Pattern)。
1.3工廠方法模式要點
工廠方法模式提供一個抽象工廠接口來聲明抽象工廠方法,而由其子類來具體實現工廠方法,創建具體的產品對象。
1.4設計步驟及代碼示例
- 步驟1:創建抽象工廠類,定義具體工廠的公共接口。
- 步驟2:創建抽象產品類,定義具體產品的公共接口。
- 步驟3:創建具體產品類(繼承抽象產品類)&定義生產的具體產品。
- 步驟4:創建具體工廠類(繼承抽象工廠類),定義創建對應具體產品實例的方法。
- 步驟5:外界通過調用具體工廠類的方法,從而創建不同具體產品類的實例。
代碼示例
#include <iostream>using namespace std;class Car//車類 { public:virtual void Show(void) = 0;virtual ~Car() {} };class BydCar : public Car//比亞迪汽車 { public:BydCar() { cout << "Byd::Byd()" << endl; }~BydCar() {}virtual void Show(void){cout << "BYD auto" << endl;} };class GeelyCar : public Car//吉利汽車 { public:GeelyCar() { cout << "Geely::Geelyo" << endl; }~GeelyCar() {}virtual void Show(void){ cout << "GEELY auto" << endl; }};class Factory//車廠 { public:virtual Car* createCar(void) = 0; };class BydFactory : public Factory { public:virtual Car* createCar(void) { return (new BydCar()); } };class GeelyFactory : public Factory { public:virtual Car* createCar(void) { return (new GeelyCar()); } };int main() {Factory* factory = new BydFactory();Car* bydCar = factory->createCar();factory = new GeelyFactory();Car* GeelyCar = factory->createCar();delete factory;delete bydCar;delete GeelyCar;return 0; }1.5工廠方法模式結構圖中包含角色
- 組成(角色):抽象產品(Product)
關系:具體產品類型的基類。
作用:描述具體產品的公共接口。 - 組成(角色):具體產品(Concrete Product)
關系:抽象產品類型的派生類(子類),工廠類創建的目標類(具體工廠和具體產品之間一一對應)。
作用:描述生產的具體產品。 - 組成(角色):抽象工廠(Factory)
關系:具體工廠的父類。
作用:聲明了工廠方法(Factory Method),用于返回一個產品。抽象工廠是工廠方法模式的核心,所有創建對象的工廠類都必須實現該接口。 - 組成(角色):具體工廠(Concrete Factory)
關系:抽象工廠的子類;被外界調用。
作用:描述具體工廠;實現FactoryMethod(創建產品的實例)工廠方法,并可由客戶端調用,返回一個具體產品類的實例。
與簡單工廠模式相比,工廠方法模式最重要的區別是引入了抽象工廠角色,抽象工廠可以是接口,也可以是抽象類或者具體類。
1.6工廠方法模式的主要優點和缺點
- 工廠放發模式有點如下:
(1) 在工廠方法模式中,工廠方法用來創建客戶所需要的產品,同時還向客戶隱藏了哪種具體產品類將被實例化這一細節,用戶只需要關心所需產品對應的工廠,無須關心創建細節,甚至無須知道具體產品類的類名。
(2) 基于工廠角色和產品角色的多態性設計是工廠方法模式的關鍵。它能夠讓工廠可以自主確定創建何種產品對象,而如何創建這個對象的細節則完全封裝在具體工廠內部。工廠方法模式之所以又被稱為多態工廠模式,就正是因為所有的具體工廠類都具有同一抽象父類。
(3) 使用工廠方法模式的另一個優點是在系統中加入新產品時,無須修改抽象工廠和抽象產品提供的接口,無須修改客戶端,也無須修改其他的具體工廠和具體產品,而只要添加一個具體工廠和具體產品就可以了,這樣,系統的可擴展性也就變得非常好,完全符合“開閉原則”。
- 工廠方法模式的缺點如下:
(1) 在添加新產品時,需要編寫新的具體產品類,而且還要提供與之對應的具體工廠類,系統中類的個數將成對增加,在一定程度上增加了系統的復雜度,有更多的類需要編譯和運行,會給系統帶來一些額外的開銷。
(2) 由于考慮到系統的可擴展性,需要引入抽象層,在客戶端代碼中均使用抽象層進行定義,增加了系統的抽象性和理解難度,且在實現時可能需要用到DOM、反射等技術,增加了系統的實現難度。
- 適用場景
(1) 客戶端不知道它所需要的對象的類。在工廠方法模式中,客戶端不需要知道具體產品類的類名,只需要知道所對應的工廠即可,具體的產品對象由具體工廠類創建,可將具體工廠類的類名存儲在配置文件或數據庫中。
(2) 抽象工廠類通過其子類來指定創建哪個對象。在工廠方法模式中,對于抽象工廠類只需要提供一個創建產品的接口,而由其子類來確定具體要創建的對象,利用面向對象的多態性和里氏代換原則,在程序運行時,子類對象將覆蓋父類對象,從而使得系統更容易擴展。
1.7工廠方法模式總結
工廠方法模式是簡單工廠模式的延伸,它繼承了簡單工廠模式的優點,同時還彌補了簡單工廠模式的不足。工廠方法模式是使用頻率最高的設計模式之一,是很多開源框架和API類庫的核心模式。
在工廠方法模式中,核心的工廠類不再負責所有產品的創建,而是將具體創建工作交給子類去做。這個核心類僅僅負責給出具體工廠必須實現的接口,而不負責哪一個產品類被實例化這種細節,這使得工廠方法模式可以允許系統在不修改工廠角色的情況下引進新產品。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的设计模式——工厂模式(二)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Linux】vim简单配置
- 下一篇: [NOTE] XMLHttpReques