C++設(shè)計(jì)模式之工廠方法模式
問(wèn)題描述
之前講到了C++設(shè)計(jì)模式——簡(jiǎn)單工廠模式,由于簡(jiǎn)單工廠模式的局限性,比如:工廠現(xiàn)在能生產(chǎn)ProductA、ProductB和ProductC三種產(chǎn)品了,此時(shí),需要增加生產(chǎn)ProductD產(chǎn)品;那么,首先是不是需要在產(chǎn)品枚舉類型中添加新的產(chǎn)品類型標(biāo)識(shí),然后,修改Factory類中的switch結(jié)構(gòu)代碼。是的,這種對(duì)代碼的修改,對(duì)原有代碼的改動(dòng)量較大,易產(chǎn)生編碼上的錯(cuò)誤(雖然很簡(jiǎn)單,如果工程大了,出錯(cuò)也是在所難免的!?。。_@種對(duì)代碼的修改是最原始,最野蠻的修改,本質(zhì)上不能稱之為對(duì)代碼的擴(kuò)展。同時(shí),由于對(duì)已經(jīng)存在的函數(shù)進(jìn)行了修改,那么以前進(jìn)行過(guò)的測(cè)試,都將是無(wú)效的,所有的測(cè)試,都將需要重新進(jìn)行,所有的代碼都需要進(jìn)行重新覆蓋。這種,增加成本,不能提高效率的事情,在公司是絕對(duì)不允許的(除非昏庸的PM)。出于種種原因,簡(jiǎn)單工廠模式,在實(shí)際項(xiàng)目中使用的較少。那么該怎么辦?怎么辦呢?需要對(duì)原有代碼影響降到最小,同時(shí)能對(duì)原有功能進(jìn)行擴(kuò)展。
UML類圖
那么今天介紹的工廠方法模式,就隆重登場(chǎng)了。它只是對(duì)簡(jiǎn)單工廠模式的擴(kuò)展,在GOF的介紹中,它們是合并在一起的,而我則是單獨(dú)分開(kāi)進(jìn)行講解的,就是為了區(qū)分二者的利弊,便于大家在實(shí)際項(xiàng)目中進(jìn)行更好的把握與應(yīng)用。工廠方法模式是在簡(jiǎn)單工廠模式的基礎(chǔ)上,對(duì)“工廠”添加了一個(gè)抽象層。將工廠共同的動(dòng)作抽象出來(lái),作為抽象類,而具體的行為由子類本身去實(shí)現(xiàn),讓子類去決定生產(chǎn)什么樣的產(chǎn)品。

如圖,F(xiàn)actoryA專心負(fù)責(zé)生產(chǎn)ProductA,F(xiàn)actoryB專心負(fù)責(zé)生產(chǎn)ProductB,F(xiàn)actoryA和FactoryB之間沒(méi)有關(guān)系;如果到了后期,如果需要生產(chǎn)ProductC時(shí),我們則可以創(chuàng)建一個(gè)FactoryC工廠類,該類專心負(fù)責(zé)生產(chǎn)ProductC類產(chǎn)品。由于FactoryA、FactoryB和FactoryC之間沒(méi)有關(guān)系,當(dāng)加入FactoryC加入時(shí),對(duì)FactoryA和FactoryB的工作沒(méi)有產(chǎn)生任何影響,那么對(duì)代碼進(jìn)行測(cè)試時(shí),只需要單獨(dú)對(duì)FactoryC和ProductC進(jìn)行單元測(cè)試,而FactoryA和FactoryB則不用進(jìn)行測(cè)試,則可省去大量無(wú)趣無(wú)味的測(cè)試工作。
適用場(chǎng)合
工廠方法模式的意義是定義一個(gè)創(chuàng)建產(chǎn)品對(duì)象的工廠接口,將實(shí)際創(chuàng)建工作推遲到子類當(dāng)中。核心工廠類不再負(fù)責(zé)產(chǎn)品的創(chuàng)建,這樣核心類成為一個(gè)抽象工廠角色,僅負(fù)責(zé)具體工廠子類必須實(shí)現(xiàn)的接口,這樣進(jìn)一步抽象化的好處是使得工廠方法模式可以使系統(tǒng)在不修改具體工廠角色的情況下引進(jìn)新的產(chǎn)品。
1.在設(shè)計(jì)的初期,就考慮到產(chǎn)品在后期會(huì)進(jìn)行擴(kuò)展的情況下,可以使用工廠方法模式;
2.產(chǎn)品結(jié)構(gòu)較復(fù)雜的情況下,可以使用工廠方法模式;
由于使用設(shè)計(jì)模式是在詳細(xì)設(shè)計(jì)時(shí),就需要進(jìn)行定奪的,所以,需要權(quán)衡多方面的因素,而不能為了使用設(shè)計(jì)模式而使用設(shè)計(jì)模式。
代碼實(shí)現(xiàn):
/*
** FileName : FactoryMethodPatternDemo
** Author : Jelly Young
** Date : 2013/11/18
** Description : More information, please go to http://www.dhdzp.com
*/
#include <iostream>
using namespace std;
class Product
{
public:
virtual void Show() = 0;
};
class ProductA : public Product
{
public:
void Show()
{
cout<< "I'm ProductA"<<endl;
}
};
class ProductB : public Product
{
public:
void Show()
{
cout<< "I'm ProductB"<<endl;
}
};
class Factory
{
public:
virtual Product *CreateProduct() = 0;
};
class FactoryA : public Factory
{
public:
Product *CreateProduct()
{
return new ProductA ();
}
};
class FactoryB : public Factory
{
public:
Product *CreateProduct()
{
return new ProductB ();
}
};
int main(int argc , char *argv [])
{
Factory *factoryA = new FactoryA ();
Product *productA = factoryA->CreateProduct();
productA->Show();
Factory *factoryB = new FactoryB ();
Product *productB = factoryB->CreateProduct();
productB->Show();
if (factoryA != NULL)
{
delete factoryA;
factoryA = NULL;
}
if (productA != NULL)
{
delete productA;
productA = NULL;
}
if (factoryB != NULL)
{
delete factoryB;
factoryB = NULL;
}
if (productB != NULL)
{
delete productB;
productB = NULL;
}
return 0;
}
相關(guān)文章
C++通過(guò)boost.date_time進(jìn)行時(shí)間運(yùn)算
這篇文章介紹了C++通過(guò)boost.date_time進(jìn)行時(shí)間運(yùn)算的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
C++使用string的大數(shù)除法運(yùn)算(4)
這篇文章主要為大家詳細(xì)介紹了C++使用string的大數(shù)除法運(yùn)算,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-09-09
如何通過(guò)C++在Bing搜索引擎上進(jìn)行命令行搜索
這篇文章主要介紹了通過(guò)C++在Bing搜索引擎上進(jìn)行命令行搜索,在這篇文章中,我們將介紹一個(gè)簡(jiǎn)單的C++程序,允許用戶通過(guò)命令行輸入搜索詞,在Bing搜索引擎上執(zhí)行搜索,并在默認(rèn)瀏覽器中顯示搜索結(jié)果,需要的朋友可以參考下2023-12-12
c++ 寫注冊(cè)表方式讓程序開(kāi)機(jī)自啟動(dòng)
這篇文章主要介紹了c++ 寫注冊(cè)表方式讓程序開(kāi)機(jī)自啟動(dòng),需要的朋友可以參考下2017-09-09
C++ HLSL實(shí)現(xiàn)簡(jiǎn)單的圖像處理功能
本文主要介紹了HLSL實(shí)現(xiàn)簡(jiǎn)單的圖像處理功能的方法,具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧2017-02-02
C++模擬實(shí)現(xiàn)vector示例代碼圖文講解
這篇文章主要介紹了C++容器Vector的模擬實(shí)現(xiàn),Vector是一個(gè)能夠存放任意類型的動(dòng)態(tài)數(shù)組,有點(diǎn)類似數(shù)組,是一個(gè)連續(xù)地址空間,下文更多詳細(xì)內(nèi)容的介紹,需要的小伙伴可以參考一下2023-02-02
簡(jiǎn)單分析針對(duì)ARM平臺(tái)的C語(yǔ)言程序的編譯問(wèn)題
這篇文章主要介紹了針對(duì)ARM平臺(tái)的C語(yǔ)言程序的編譯問(wèn)題,從優(yōu)化編譯選項(xiàng)的幾個(gè)方面進(jìn)行分析,需要的朋友可以參考下2015-12-12
C語(yǔ)言計(jì)算器的3種實(shí)現(xiàn)方法代碼
這篇文章主要給大家介紹了關(guān)于C語(yǔ)言計(jì)算器的3種實(shí)現(xiàn)方法,文中通過(guò)代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一的參考借鑒價(jià)值,需要的朋友可以參考下2007-01-01

