设计模式之简单工厂模式(Simply Factory)摘录
從設(shè)計(jì)模式的類(lèi)型上來(lái)說(shuō),簡(jiǎn)單工廠模式是屬于創(chuàng)建型模式,又叫靜態(tài)工廠方法(Static Factory Method)模式,但不屬于23種GOF設(shè)計(jì)模式之一。簡(jiǎn)單工廠模式是由一個(gè)工廠對(duì)象決定創(chuàng)建出哪一種產(chǎn)品類(lèi)的實(shí)例。簡(jiǎn)單工廠模式是工廠模式家族中最簡(jiǎn)單實(shí)用的模式,可以理解為是不同工廠模式的一個(gè)特殊實(shí)現(xià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)部邏輯(一個(gè)個(gè)if/else分支或者switch/case分支)。工廠類(lèi)可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對(duì)象;(2)、抽象產(chǎn)品(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í)例。
???????? 優(yōu)缺點(diǎn):(1)、優(yōu)點(diǎn):工廠類(lèi)是整個(gè)模式的關(guān)鍵,包含了必要的邏輯判斷,根據(jù)外界給定的信息,決定究竟應(yīng)該創(chuàng)建哪個(gè)具體類(lèi)的對(duì)象。通過(guò)使用工廠類(lèi),外界可以從直接創(chuàng)建具體產(chǎn)品對(duì)象的尷尬局面擺脫出來(lái),僅僅需要負(fù)責(zé)”消費(fèi)”對(duì)象就可以了。而不必管這些對(duì)象究竟如何創(chuàng)建及如何組織的。明確了各自的職責(zé)和權(quán)利,有利于整個(gè)軟件體系結(jié)構(gòu)的優(yōu)化。(2)、缺點(diǎn):由于工廠類(lèi)集中了所有實(shí)例的創(chuàng)建邏輯,違反了高內(nèi)聚責(zé)任分配原則,將全部創(chuàng)建邏輯集中到了一個(gè)工廠類(lèi)中;它所能創(chuàng)建的類(lèi)只能是事先考慮到的如果需要添加新的類(lèi),則就需要改變工廠類(lèi)了。當(dāng)系統(tǒng)中的具體產(chǎn)品類(lèi)不斷增多的時(shí)候,可能會(huì)出現(xiàn)要求工廠類(lèi)根據(jù)不同條件創(chuàng)建不同實(shí)例的需求。這種對(duì)條件的判斷和對(duì)具體產(chǎn)品類(lèi)型的判斷交錯(cuò)在一起,很難避免模塊功能的蔓延,對(duì)系統(tǒng)的維護(hù)和擴(kuò)展非常不利。這些缺點(diǎn)在工廠方法模式中得到了一定的克服。
???????? 使用場(chǎng)景:工廠類(lèi)負(fù)責(zé)創(chuàng)建的對(duì)象比較少;客戶(hù)只知道傳入工廠類(lèi)的參數(shù),對(duì)于如何創(chuàng)建對(duì)象(邏輯)不關(guān)心;由于簡(jiǎn)單工廠很容易違反高內(nèi)聚責(zé)任分配原則,因此一般只在很簡(jiǎn)單的情況下應(yīng)用。
???????? 簡(jiǎn)單工廠模式只需一個(gè)工廠類(lèi),而工廠方法模式的工廠類(lèi)隨著產(chǎn)品類(lèi)個(gè)數(shù)增加而增加。工廠方法模式每個(gè)具體工廠類(lèi)只完成單一任務(wù)。簡(jiǎn)單工廠模式的工廠類(lèi)是個(gè)靜態(tài)類(lèi),在客戶(hù)端無(wú)需實(shí)例化。
???????? 工廠方法模式:一個(gè)抽象產(chǎn)品類(lèi),可以派生出多個(gè)具體產(chǎn)品類(lèi)。一個(gè)抽象工廠類(lèi),可以派生出多個(gè)具體工廠類(lèi)。每個(gè)具體工廠類(lèi)只能創(chuàng)建一個(gè)具體產(chǎn)品類(lèi)的實(shí)例。
???????? 抽象工廠模式:多個(gè)抽象產(chǎn)品類(lèi),每個(gè)抽象產(chǎn)品類(lèi)可以派生出多個(gè)具體產(chǎn)品類(lèi)。一個(gè)抽象工廠類(lèi),可以派生出多個(gè)具體工廠類(lèi)。每個(gè)具體工廠類(lèi)可以創(chuàng)建多個(gè)具體產(chǎn)品類(lèi)的實(shí)例。
示例代碼:
#include <iostream>
using namespace std;typedef enum ProductTypeTag
{ADD = 1,SUB = 2,MUL = 3,DIV = 4
}PRODUCTTYPE;//基類(lèi)
class COperation
{
public:COperation() : m_numA(0.0), m_numB(0.0) {cout<<"COperation constructor"<<endl;}virtual ~COperation() {cout<<"COperation destructor"<<endl;}virtual double GetResult() = 0;protected:double m_numA;double m_numB;
};//加法
class CAddOperation : public COperation
{
public:CAddOperation(double a, double b){cout<<"CAddOperation constructor"<<endl;m_numA = a;m_numB = b;}virtual ~CAddOperation(){cout<<"CAddOperation destructor"<<endl;}virtual double GetResult(){return (m_numA + m_numB);}
};//減法
class CSubOperation : public COperation
{
public:CSubOperation(double a, double b){cout<<"CSubOperation constructor"<<endl;m_numA = a;m_numB = b;}virtual ~CSubOperation(){cout<<"CSubOperation destructor"<<endl;}virtual double GetResult(){return (m_numA - m_numB);}
};//乘法
class CMulOperation : public COperation
{
public:CMulOperation(double a, double b){cout<<"CMulOperation constructor"<<endl;m_numA = a;m_numB = b;}virtual ~CMulOperation(){cout<<"CMulOperation destructor"<<endl;}virtual double GetResult(){return (m_numA * m_numB);}
};//除法
class CDivOperation : public COperation
{
public:CDivOperation(double a, double b){cout<<"CDivOperation constructor"<<endl;m_numA = a;m_numB = b;}virtual ~CDivOperation(){cout<<"CDivOperation destructor"<<endl;}virtual double GetResult(){return (m_numA / m_numB);}
};//工廠類(lèi)
class CCalculatorFactory
{
public:static COperation* CreateOperation(PRODUCTTYPE type, double a, double b){switch (type){case 1:return new CAddOperation(a, b);break;case 2:return new CSubOperation(a, b);break;case 3:return new CMulOperation(a, b);break;case 4:return new CDivOperation(a, b);break;default:return NULL;}}
};int main()
{CCalculatorFactory* calFactory = new CCalculatorFactory();int type = 0;double a = 10, b = 2;type = 1;COperation* operation = calFactory->CreateOperation((PRODUCTTYPE)type, a, b);if (operation) {cout<<operation->GetResult()<<endl;delete operation;operation = NULL;}type = 2;operation = calFactory->CreateOperation((PRODUCTTYPE)type, a, b);if (operation) {cout<<operation->GetResult()<<endl;delete operation;operation = NULL;}type = 3;operation = calFactory->CreateOperation((PRODUCTTYPE)type, a, b);if (operation) {cout<<operation->GetResult()<<endl;delete operation;operation = NULL;}type = 4;operation = calFactory->CreateOperation((PRODUCTTYPE)type, a, b);if (operation) {cout<<operation->GetResult()<<endl;delete operation;operation = NULL;}if (calFactory) {delete calFactory;calFactory = NULL;}/*resultCOperation constructorCAddOperation constructor12CAddOperation destructorCOperation destructorCOperation constructorCSubOperation constructor8CSubOperation destructorCOperation destructorCOperation constructorCMulOperation constructor20CMulOperation destructorCOperation destructorCOperation constructorCDivOperation constructor5CDivOperation destructorCOperation destructor*/return 0;
}
簡(jiǎn)單工廠模式結(jié)構(gòu)圖:
簡(jiǎn)單工廠模式、工廠方法模式、抽象工廠模式三者之間的區(qū)別:
(1)、簡(jiǎn)單工廠模式:一個(gè)工廠類(lèi)(負(fù)責(zé)創(chuàng)建所有實(shí)例的內(nèi)部邏輯,此工廠類(lèi)可以被外界直接調(diào)用,此工廠類(lèi)是個(gè)靜態(tài)類(lèi),在客戶(hù)端無(wú)需實(shí)例化),一個(gè)抽象產(chǎn)品類(lèi)(所有具體產(chǎn)品類(lèi)的父類(lèi),負(fù)責(zé)描述所有實(shí)例共有的公共接口),多個(gè)具體產(chǎn)品類(lèi)。
(2)、工廠方法模式:一個(gè)抽象工廠類(lèi),多個(gè)具體工廠類(lèi)(每個(gè)具體工廠類(lèi)只能創(chuàng)建一個(gè)具體產(chǎn)品類(lèi)實(shí)例),一個(gè)抽象產(chǎn)品類(lèi),多個(gè)具體產(chǎn)品類(lèi)。
(3)、抽象工廠模式:一個(gè)抽象工廠類(lèi),多個(gè)具體工廠類(lèi)(每個(gè)具體工廠類(lèi)可以創(chuàng)建多個(gè)具體產(chǎn)品類(lèi)實(shí)例),多個(gè)抽象產(chǎn)品類(lèi)(每個(gè)抽象產(chǎn)品類(lèi)可以派生出多個(gè)具體產(chǎn)品類(lèi)),多個(gè)具體產(chǎn)品類(lèi)。
參考文獻(xiàn):
1、? http://baike.baidu.com/view/1227908.htm
2、? http://www.cnblogs.com/beniao/archive/2008/08/09/1263318.html
3、? http://blog.csdn.net/lilu_leo/article/details/7592678
4、? http://www.jellythink.com/archives/42
5、? http://www.cppblog.com/wolf/articles/122609.html
6、? http://www.mianwww.com/html/2011/12/12375.html
總結(jié)
以上是生活随笔為你收集整理的设计模式之简单工厂模式(Simply Factory)摘录的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 结构体中最后一个成员为[0]或[1]长度
- 下一篇: 设计模式之适配器模式(Adapter)摘