真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

三種工廠模式的C++實(shí)現(xiàn)

引出工廠模式的設(shè)計(jì)問(wèn)題

◆ 1.為了提高內(nèi)聚(Cohesion)和松耦合(Coupling),我們經(jīng)常會(huì)抽象出一些類的公共接口以形成抽象基類或者接口。這樣我們可以通過(guò)聲明一個(gè)指向基類的指針來(lái)指向?qū)嶋H的子類實(shí)現(xiàn),達(dá)到了多態(tài)的目的。這里很容易出現(xiàn)的一個(gè)問(wèn)題 n 多的子類繼承自抽象基類,我們不得不在每次要用到子類的地方就編寫諸如 new ×××;的代碼。這里帶來(lái)兩個(gè)問(wèn)題:
客戶程序員必須知道實(shí)際子類的名稱(當(dāng)系統(tǒng)復(fù)雜后,命名將是一個(gè)很不好處理的問(wèn)題,為了處理可能的名字沖突,有的命名可能并不是具有很好的可讀性和可記憶性,就姑且不論不同程序員千奇百怪的個(gè)人偏好了)。
程序的擴(kuò)展性和維護(hù)變得越來(lái)越困難。
◆ 2.還有一種情況就是在父類中并不知道具體要實(shí)例化哪一個(gè)具體的子類。這里的意思為:假設(shè)我們?cè)陬?A 中要使用到類 B,B 是一個(gè)抽象父類,在 A 中并不知道具體要實(shí)例化那一個(gè) B 的子類,但是在類 A 的子類 D 中是可以知道的。在 A 中我們沒(méi)有辦法直接使用類似于 new ×××的語(yǔ)句,因?yàn)楦揪筒恢馈痢痢潦鞘裁础?br />
以上兩個(gè)問(wèn)題也就引出了工廠模式的兩個(gè)最重要的功能:
定義創(chuàng)建對(duì)象的接口,封裝了對(duì)象的創(chuàng)建;
使得具體化類的工作延遲到了子類中。

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括石鼓網(wǎng)站建設(shè)、石鼓網(wǎng)站制作、石鼓網(wǎng)頁(yè)制作以及石鼓網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,石鼓網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到石鼓省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

對(duì)于工廠模式,為了使其能更好的解決多種情況的問(wèn)題,將其分為三類:簡(jiǎn)單工廠模式(Simple Factory),工廠方法模式(Factory Method),抽象工廠模式(Abstract Factory)。下面來(lái)一一搞定。

簡(jiǎn)單工廠

       具體情形:有一個(gè)肥皂廠,生產(chǎn)各種肥皂,有舒膚佳,夏士蓮,娜愛(ài)斯等。給這個(gè)肥皂廠建模。

       UML圖如下:

三種工廠模式的C++實(shí)現(xiàn)

對(duì)于簡(jiǎn)單設(shè)計(jì)模式的結(jié)構(gòu)圖,我們可以很清晰的看到它的組成:
1) 工廠類角色:這是本模式的核心,含有一定的商業(yè)邏輯和判斷邏輯。
2) 抽象產(chǎn)品角色:它一般是具體產(chǎn)品繼承的父類或者實(shí)現(xiàn)的接口。
3) 具體產(chǎn)品角色:工廠類所創(chuàng)建的對(duì)象就是此角色的實(shí)例。
簡(jiǎn)單設(shè)計(jì)模式存在的目的很簡(jiǎn)單:定義一個(gè)用于創(chuàng)建對(duì)象的接口。

缺點(diǎn):對(duì)修改不封閉,新增加產(chǎn)品您要修改工廠。違法了鼎鼎大名的開(kāi)閉法則(OCP)。

代碼實(shí)現(xiàn):


#include 
usingnamespace std; 
enum PRODUCTTYPE {SFJ,XSL,NAS}; 
class soapBase 
{ 
public: 
virtual ~soapBase(){}; 
virtualvoid show() = 0; 
}; 
class SFJSoap:public soapBase 
{ 
public: 
void show() {cout<<"SFJ Soap!"<show(); 
    soapBase* pSoap2 = factory.creatSoap(XSL); 
    pSoap2->show(); 
    soapBase* pSoap3 = factory.creatSoap(NAS); 
    pSoap3->show(); 
delete pSoap1; 
delete pSoap2; 
delete pSoap3; 
return 0; 
}

運(yùn)行結(jié)果

三種工廠模式的C++實(shí)現(xiàn)

工廠方法模式

具體情形:最近莫名肥皂需求激增!! 于是要獨(dú)立每個(gè)生產(chǎn)線,每個(gè)生產(chǎn)線只生產(chǎn)一種肥皂。

UML圖如下:

三種工廠模式的C++實(shí)現(xiàn)

       其實(shí)這才是真正的工廠模式,簡(jiǎn)單工廠模式只能算是“坑爹版”的工廠模式。我們能很容易看出工廠方法模式和簡(jiǎn)單工廠模式的區(qū)別之處。工廠方法模式的應(yīng)用并不是只是為了封裝對(duì)象的創(chuàng)建,而是要把對(duì)象的創(chuàng)建放到子類中實(shí)現(xiàn):Factory中只是提供了對(duì)象創(chuàng)建的接口,其實(shí)現(xiàn)將放在Factory的子類ConcreteFactory中進(jìn)行。
對(duì)于工廠方法模式的組成:
1)抽象工廠角色: 這是工廠方法模式的核心,它與應(yīng)用程序無(wú)關(guān)。是具體工廠角色必須實(shí)現(xiàn)的接口或者必須繼承的父類。
2)具體工廠角色:它含有和具體業(yè)務(wù)邏輯有關(guān)的代碼。由應(yīng)用程序調(diào)用以創(chuàng)建對(duì)應(yīng)的具體產(chǎn)品的對(duì)象。
3)抽象產(chǎn)品角色:它是具體產(chǎn)品繼承的父類或者是實(shí)現(xiàn)的接口。
4)具體產(chǎn)品角色:具體工廠角色所創(chuàng)建的對(duì)象就是此角色的實(shí)例。

缺點(diǎn):每增加一種產(chǎn)品,就需要增加一個(gè)對(duì)象的工廠。如果這家公司發(fā)展迅速,推出了很多新的處理器核,那么就要開(kāi)設(shè)相應(yīng)的新工廠。在C++實(shí)現(xiàn)中,就是要定義一個(gè)個(gè)的工廠類。顯然,相比簡(jiǎn)單工廠模式,工廠方法模式需要更多的類定義。

代碼實(shí)現(xiàn):

#include 
usingnamespace std; 
enum SOAPTYPE {SFJ,XSL,NAS}; 
class soapBase 
{ 
public: 
virtual ~soapBase(){}; 
virtualvoid show() = 0; 
}; 
class SFJSoap:public soapBase 
{ 
public: 
void show() {cout<<"SFJ Soap!"<show(); 
    XSLFactory factory2; 
    soapBase* pSoap2 = factory2.creatSoap(); 
    pSoap2->show(); 
    NASFactory factory3; 
    soapBase* pSoap3 = factory3.creatSoap(); 
    pSoap3->show(); 
delete pSoap1; 
delete pSoap2; 
delete pSoap3; 
return 0; 
}

運(yùn)行結(jié)果

三種工廠模式的C++實(shí)現(xiàn)

抽象工廠模式

具體情形:這個(gè)肥皂廠發(fā)現(xiàn)搞牙膏也很賺錢,決定做牙膏。牙膏有高檔低檔,肥皂也是?,F(xiàn)在搞兩個(gè)廠房,一個(gè)生產(chǎn)低檔的牙膏和肥皂,一個(gè)生產(chǎn)高檔的牙膏和肥皂。

比如,廠房一生產(chǎn)中華牙膏、娜愛(ài)斯肥皂,廠房二生產(chǎn)黑人牙膏和舒膚佳牙膏

UML圖如下:

三種工廠模式的C++實(shí)現(xiàn)

對(duì)于上面的結(jié)構(gòu)圖,可以看出抽象工廠模式,比前兩者更為的復(fù)雜和一般性,抽象工廠模式和工廠方法模式的區(qū)別就在于需要?jiǎng)?chuàng)建對(duì)象的復(fù)雜程度上。
抽象工廠模式:給客戶端提供一個(gè)接口,可以創(chuàng)建多個(gè)產(chǎn)品族中的產(chǎn)品對(duì)象 ,而且使用抽象工廠模式還要滿足一下條件:
1)系統(tǒng)中有多個(gè)產(chǎn)品族,而系統(tǒng)一次只可能消費(fèi)其中一族產(chǎn)品。
2)同屬于同一個(gè)產(chǎn)品族的產(chǎn)品以其使用。

抽象工廠模式的組成(和工廠方法模式一樣):
1)抽象工廠角色:這是工廠方法模式的核心,它與應(yīng)用程序無(wú)關(guān)。是具體工廠角色必須實(shí)現(xiàn)的接口或者必須繼承的父類。
2)具體工廠角色:它含有和具體業(yè)務(wù)邏輯有關(guān)的代碼。由應(yīng)用程序調(diào)用以創(chuàng)建對(duì)應(yīng)的具體產(chǎn)品的對(duì)象。
3)抽象產(chǎn)品角色:它是具體產(chǎn)品繼承的父類或者是實(shí)現(xiàn)的接口。
4)具體產(chǎn)品角色:具體工廠角色所創(chuàng)建的對(duì)象就是此角色的實(shí)例。

代碼實(shí)現(xiàn)

#include 
usingnamespace std; 
enum SOAPTYPE {SFJ,XSL,NAS}; 
enum TOOTHTYPE {HR,ZH}; 
class SoapBase 
{ 
public: 
virtual ~SoapBase(){}; 
virtualvoid show() = 0; 
}; 
class SFJSoap:public SoapBase 
{ 
public: 
void show() {cout<<"SFJ Soap!"<show(); 
    pToothpaste1->show(); 
    SoapBase *pSoap2 = NULL; 
    ToothBase *pToothpaste2 = NULL; 
    pSoap2 = factory2.creatSoap(); 
    pToothpaste2 = factory2.creatToothpaste(); 
    pSoap2->show(); 
    pToothpaste2->show(); 
delete pSoap1; 
delete pSoap2; 
delete pToothpaste1; 
delete pToothpaste2; 
return 0; 
}

運(yùn)行結(jié)果

三種工廠模式的C++實(shí)現(xiàn)

參考

C++設(shè)計(jì)模式 http://www.weixueyuan.net/cpp/shejimoshi/

設(shè)計(jì)模式C++實(shí)現(xiàn)(1)——工廠模式 - http://blog.csdn.net/wuzhekai1985/article/details/6660462


分享標(biāo)題:三種工廠模式的C++實(shí)現(xiàn)
文章出自:http://weahome.cn/article/pjepie.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部