C++設(shè)計(jì)模式之簡(jiǎn)單工廠模式實(shí)例
問(wèn)題描述
之前在公司做了一個(gè)windows 8平臺(tái)的閱讀器。首先,需要將電子書(shū)中的內(nèi)容渲染到屏幕上,而電子書(shū)每一頁(yè)都包含各種各樣的內(nèi)容,比如:圖形、圖像和文字等等;不同的內(nèi)容,就是不同的對(duì)象;在將不同的內(nèi)容渲染到屏幕上之前,就需要new操作,建立不同的對(duì)象,然后再在屏幕上進(jìn)行描繪。這個(gè)時(shí)候,就需要進(jìn)行很多new操作,new操作分布在代碼的不同地方,管理起來(lái)很麻煩,而且也很亂,到后期擴(kuò)展和維護(hù)的時(shí)候,有的時(shí)候,對(duì)象多的讓開(kāi)發(fā)人員不知道這個(gè)對(duì)象是干什么的,這就增加了難度;同時(shí),new操作,都會(huì)有對(duì)應(yīng)的異常處理,最后,就會(huì)發(fā)現(xiàn),在代碼中,new了一個(gè)對(duì)象,然后,就跟著一段異常處理代碼,這時(shí)編碼變的極其混亂和臃腫。那么怎么辦?怎么辦?此時(shí),我們需要一個(gè)新的類(lèi),專(zhuān)門(mén)從事對(duì)象的建立和釋放,之后,對(duì)象的各種操作,和這個(gè)類(lèi)沒(méi)有任何關(guān)系。這個(gè)專(zhuān)門(mén)建立對(duì)象的類(lèi),向外暴漏創(chuàng)建對(duì)象的接口,供外部調(diào)用。
工廠模式有一種非常形象的描述,建立對(duì)象的類(lèi)就如一個(gè)工廠,而需要被建立的對(duì)象就是一個(gè)個(gè)產(chǎn)品;在工廠中加工產(chǎn)品,使用產(chǎn)品的人,不用在乎產(chǎn)品是如何生產(chǎn)出來(lái)的。從軟件開(kāi)發(fā)的角度來(lái)說(shuō),這樣就有效的降低了模塊之間的耦合。
UML類(lèi)圖
對(duì)于工廠模式,具體上可以分為三類(lèi):
1.簡(jiǎn)單工廠模式;
2.工廠方法模式;
3.抽象工廠模式。
對(duì)于上面的三種工廠模式,從上到下逐步抽象,并且更具一般性。而這篇博文主要講的是簡(jiǎn)單工廠模式,后兩種會(huì)在之后的博文中接著總結(jié)。

ProductA、ProductB和ProductC繼承自Product虛擬類(lèi),Show方法是不同產(chǎn)品的自描述;Factory依賴(lài)于ProductA、ProductB和ProductC,F(xiàn)actory根據(jù)不同的條件創(chuàng)建不同的Product對(duì)象。
適用場(chǎng)合
1.在程序中,需要?jiǎng)?chuàng)建的對(duì)象很多,導(dǎo)致對(duì)象的new操作多且雜時(shí),需要使用簡(jiǎn)單工廠模式;
2.由于對(duì)象的創(chuàng)建過(guò)程是我們不需要去關(guān)心的,而我們注重的是對(duì)象的實(shí)際操作,所以,我們需要分離對(duì)象的創(chuàng)建和操作兩部分,如此,方便后期的程序擴(kuò)展和維護(hù)。
代碼實(shí)現(xiàn):
/*
** FileName : SimpleFactoryPatternDemo
** Author : Jelly Young
** Date : 2013/11/17
** Description : More information
*/
#include <iostream>
#include <vector>
using namespace std;
typedef enum ProductTypeTag
{
TypeA,
TypeB,
TypeC
}PRODUCTTYPE;
// Here is the product class
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 ProductC : public Product
{
public:
void Show()
{
cout<<"I'm ProductC"<<endl;
}
};
// Here is the Factory class
class Factory
{
public:
Product* CreateProduct(PRODUCTTYPE type)
{
switch (type)
{
case TypeA:
return new ProductA();
case TypeB:
return new ProductB();
case TypeC:
return new ProductC();
default:
return NULL;
}
}
};
int main(int argc, char *argv[])
{
// First, create a factory object
Factory *ProductFactory = new Factory();
Product *productObjA = ProductFactory->CreateProduct(TypeA);
if (productObjA != NULL)
productObjA->Show();
Product *productObjB = ProductFactory->CreateProduct(TypeB);
if (productObjB != NULL)
productObjB->Show();
Product *productObjC = ProductFactory->CreateProduct(TypeC);
if (productObjC != NULL)
productObjC->Show();
delete ProductFactory;
ProductFactory = NULL;
delete productObjA;
productObjA = NULL;
delete productObjB;
productObjB = NULL;
delete productObjC;
productObjC = NULL;
return 0;
}
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)單詞小助手改進(jìn)版
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)單詞小助手的改進(jìn)版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10
C語(yǔ)言函數(shù)的遞歸和調(diào)用實(shí)例分析
一個(gè)函數(shù)在它的函數(shù)體內(nèi)調(diào)用它自身稱(chēng)為遞歸調(diào)用。這種函數(shù)稱(chēng)為遞歸函數(shù)。C語(yǔ)言允許函數(shù)的遞歸調(diào)用。在遞歸調(diào)用中,主調(diào)函數(shù)又是被調(diào)函數(shù)。執(zhí)行遞歸函數(shù)將反復(fù)調(diào)用其自身,每調(diào)用一次就進(jìn)入新的一層2013-07-07
C++棧(stack)的模板類(lèi)實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了C++棧(stack)的模板類(lèi)實(shí)現(xiàn)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
利用C++簡(jiǎn)單實(shí)現(xiàn)順序表和單鏈表的示例代碼
這篇文章主要給大家介紹了關(guān)于利用C++簡(jiǎn)單實(shí)現(xiàn)順序表和單鏈表的方法,文中給出了詳細(xì)的示例代碼供大家參考學(xué)習(xí),需要的朋友可以參考借鑒,下面來(lái)跟著小編一起來(lái)學(xué)習(xí)學(xué)習(xí)吧。2017-08-08

