實(shí)例解析C++設(shè)計(jì)模式編程中簡(jiǎn)單工廠模式的采用
簡(jiǎn)單工廠模式中專(zhuān)門(mén)定義一個(gè)類(lèi)來(lái)負(fù)責(zé)創(chuàng)建其他類(lèi)的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類(lèi)。它又稱(chēng)為靜態(tài)工廠方法模式,屬于類(lèi)的創(chuàng)建型模式。
簡(jiǎn)單工廠模式的UML類(lèi)圖

簡(jiǎn)單工廠模式的程序通過(guò)封裝繼承來(lái)降低程序的耦合度,設(shè)計(jì)模式使得程序更加的靈活,易修該,易于復(fù)用。
簡(jiǎn)單工廠是在工廠類(lèi)中做判斷,從而創(chuàng)造相應(yīng)的產(chǎn)品。
簡(jiǎn)單工廠模式的實(shí)質(zhì)是由一個(gè)工廠類(lèi)根據(jù)傳入的參數(shù),動(dòng)態(tài)決定應(yīng)該創(chuàng)建哪一個(gè)產(chǎn)品類(lèi)(這些產(chǎn)品類(lèi)繼承自一個(gè)父類(lèi)或接口)的實(shí)例。
該模式中包含的角色及其職責(zé)
1.工廠(Creator)角色
簡(jiǎn)單工廠模式的核心,它負(fù)責(zé)實(shí)現(xiàn)創(chuàng)建所有實(shí)例的內(nèi)部邏輯。工廠類(lèi)可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對(duì)象。
2.抽象(Product)角色
簡(jiǎn)單工廠模式所創(chuàng)建的所有對(duì)象的父類(lèi),它負(fù)責(zé)描述所有實(shí)例所共有的公共接口。
3.具體產(chǎn)品(Concrete Product)角色
是簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo),所有創(chuàng)建的對(duì)象都是充當(dāng)這個(gè)角色的某個(gè)具體類(lèi)的實(shí)例。
一般來(lái)講它是抽象產(chǎn)品類(lèi)的子類(lèi),實(shí)現(xiàn)了抽象產(chǎn)品類(lèi)中定義的所有接口方法。
簡(jiǎn)單工廠模式的特點(diǎn):
簡(jiǎn)單工廠模式的創(chuàng)建目標(biāo),所有創(chuàng)建的對(duì)象都是充當(dāng)這個(gè)角色的某個(gè)具體類(lèi)的實(shí)例。
在這個(gè)模式中,工廠類(lèi)是整個(gè)模式的關(guān)鍵所在。它包含必要的判斷邏輯,能夠根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類(lèi)的對(duì)象。用戶在使用時(shí)可以直接根據(jù)工廠類(lèi)去創(chuàng)建所需的實(shí)例,而無(wú)需了解這些對(duì)象是如何創(chuàng)建以及如何組織的。有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。
不難發(fā)現(xiàn),簡(jiǎn)單工廠模式的缺點(diǎn)也正體現(xiàn)在其工廠類(lèi)上,由于工廠類(lèi)集中了所有實(shí)例的創(chuàng)建邏輯,所以“高內(nèi)聚”方面做的并不好。另外,當(dāng)系統(tǒng)中的具體產(chǎn)品類(lèi)不斷增多時(shí),可能會(huì)出現(xiàn)要求工廠類(lèi)也要做相應(yīng)的修改,擴(kuò)展性并不很好。
舉個(gè)例子:有一家生產(chǎn)處理器核的廠家,它只有一個(gè)工廠,能夠生產(chǎn)兩種型號(hào)的處理器核??蛻粜枰裁礃拥奶幚砥骱?,一定要顯示地告訴生產(chǎn)工廠。
下面給出一種實(shí)現(xiàn)方案。
#include <iostream>
using namespace std;
enum CoreType
{
CORE_A,
CORE_B
};
class SingleCore
{
public:
virtual void Show() = 0;
};
/*
* A 型號(hào)單核
*/
class SingleCoreA: public SingleCore
{
public:
void Show()
{
cout<<"show SingleCoreA"<<endl;
}
};
/*
* B 型號(hào)單核
*/
class SingleCoreB: public SingleCore
{
public:
void Show()
{
cout<<"show SingleCoreB"<<endl;
}
};
/*
* 唯一的工廠,可以生產(chǎn)單核 兩種型號(hào)的處理器
*/
class Factory
{
public:
SingleCore* CreateSingleCore(CoreType ctype)
{
switch(ctype)
{
case CORE_A:
return new SingleCoreA();
case CORE_B:
return new SingleCoreB();
default:
return NULL;
}
}
};
int main()
{
Factory *pstFactory;
SingleCore *pstSingleCore;
pstFactory = new Factory();
/*
* 生產(chǎn)A核
*/
pstSingleCore = pstFactory->CreateSingleCore(CORE_A);
pstSingleCore->Show();
system("pause");
/*
* 生產(chǎn)B核
*/
pstSingleCore = pstFactory->CreateSingleCore(CORE_B);
pstSingleCore->Show();
/*
* 生產(chǎn)A核
*/
pstSingleCore = pstFactory->CreateSingleCore(CORE_A);
pstSingleCore->Show();
/*
* 生產(chǎn)A核
*/
pstSingleCore->Show();
system("pause");
/*
* 生產(chǎn)B核
*/
pstSingleCore = pstFactory->CreateSingleCore(CORE_B);
pstSingleCore->Show();
return 0;
}
運(yùn)行結(jié)果:
show SingleCoreA 請(qǐng)按任意鍵繼續(xù). . . show SingleCoreB show SingleCoreA show SingleCoreA 請(qǐng)按任意鍵繼續(xù). . . show SingleCoreB Press any key to continue
相關(guān)文章
關(guān)于VS2019 C++項(xiàng)目同時(shí)出現(xiàn)LNK2005 和LNK1169 error 的解決辦法
這篇文章主要介紹了關(guān)于VS2019 C++項(xiàng)目同時(shí)出現(xiàn)LNK2005 和LNK1169 error 的解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
C語(yǔ)言中的運(yùn)算符優(yōu)先級(jí)和結(jié)合性一覽表
這篇文章主要介紹了C語(yǔ)言中的運(yùn)算符優(yōu)先級(jí)和結(jié)合性一覽表,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02
C語(yǔ)言中動(dòng)態(tài)內(nèi)存管理初學(xué)者容易犯的6個(gè)錯(cuò)誤分享
本篇文章主要介紹了初學(xué)者使用C語(yǔ)言中動(dòng)態(tài)內(nèi)存管理的4個(gè)函數(shù)時(shí)最容易犯的6個(gè)錯(cuò)誤,以及如何避免這些錯(cuò)誤,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2023-04-04
快來(lái)領(lǐng)取!你想要的C++/C語(yǔ)言優(yōu)秀書(shū)籍
如何選擇合適的C++/C語(yǔ)言書(shū)籍,是不是已經(jīng)眼花繚亂,不知道該選擇哪本好了呢?今天我來(lái)為大家分享兩本不可錯(cuò)過(guò)的優(yōu)秀書(shū)籍2017-09-09
matlab實(shí)現(xiàn)繪制玫瑰花球的示例代碼
這篇文章主要介紹了如何利用matlab實(shí)現(xiàn)繪制玫瑰花球,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Matlab有一定的幫助,需要的可以參考一下2023-08-08
C語(yǔ)言中關(guān)于動(dòng)態(tài)內(nèi)存分配的詳解
動(dòng)態(tài)內(nèi)存是指在堆上分配的內(nèi)存,而靜態(tài)內(nèi)存是指在棧上分配的內(nèi)存。棧上分配的內(nèi)存是由系統(tǒng)分配和釋放的,空間有限,在復(fù)合語(yǔ)句或函數(shù)運(yùn)行結(jié)束后就會(huì)被系統(tǒng)自動(dòng)釋放而堆上分配的內(nèi)存則不會(huì)有這個(gè)問(wèn)題。2021-09-09

