設計模式2(工廠模式)

工廠模式專門負責將大量有共同接口的類實例化。工廠模式可以動態決定將哪一個類實例化,不必事先知道每次要實例化哪一個類。工廠模式有以下幾種形態:

 

簡單工廠(Simple Factory)模式

工廠方法(Factory Method)模式

抽象工廠(Abstract Factory)模式

 

意圖

 

定義一個用戶創建對象的接口,讓子類決定實例化哪一個類。Factory Method使一個類的實例化延遲到其子類。

工廠模式就是根據用戶的需求調用響應的函數而產生的類。

 

工廠類角色Creator (LightSimpleFactory):工廠類在客戶端的直接控制下(Create方法)創建產品對象。

 

抽象產品角色Product (Light):定義簡單工廠創建的對象的父類或它們共同擁有的接口。可以是一個類、抽象類或接口。

 

具體產品角色ConcreteProduct (BulbLight, TubeLight):定義工廠具體加工出的對象

 

源碼

// tttt5.cpp : 定義控制檯應用程序的入口點。

//

 

#include "stdafx.h"

#include <exception>  

#include <string>  

#include <iostream>  

using namespace std;  

#ifndef AFX_CLASS_OPERATION  

#define AFX_CLASS_OPERATION  

template <class T>  

class Operation  

{  

public:  

virtual T GetResult()  

{  

T result = 0;  

return result;  

}  

virtual Operation& operator =(const Operation &A)  

{  

return *this;  

}  

public:  

T _numberA;  

T _numberB;  

};  

 

//加法  

template <class T>  

class OperationAdd:public Operation<T>  

{  

public:  

virtual T GetResult()  

{  

T result = 0;  

result = _numberA + _numberB;  

return result;  

}  

 

};  

 

//減法  

template <class T>  

class OperationSub:public Operation<T>  

{  

public:  

virtual T GetResult()  

{  

T result = 0;  

result = _numberA - _numberB;  

return result;  

}  

};  

 

//乘法  

template <class T>  

class OperationMul:public Operation<T>  

{  

public:  

virtual T GetResult()  

{  

int result = 0;  

result = _numberA * _numberB;  

return result;  

}  

};  

 

//除法  

template <class T>  

class OperationDiv:public Operation<T>  

{  

public:  

virtual T GetResult()  

{  

T result = 0;  

if(_numberB == 0)  

{  

throw 1001;  

}  

result = _numberA / _numberB;  

return result;  

}  

};  

#endif  

 

 

//類工廠  

 

#ifndef AFX_CLASS_OPERATIONFACTORY  

#define AFX_CLASS_OPERATIONFACTORY  

template <class T>  

class OperationFactory  

{  

public:  

static Operation<T>* CreateOperate(string operate)  

{  

Operation<T> *oper=NULL;  

 

if(!operate.compare("+"))  

oper = new OperationAdd<T>;  

if(!operate.compare("-"))  

oper = new OperationSub<T>;  

if(!operate.compare("*"))  

oper = new OperationMul<T>;  

if(!operate.compare("/"))  

oper = new OperationDiv<T>;  

 

return oper;  

 

}  

};  

#endif  

int main(void)

 

{

 

Operation<int> *oper = NULL;  

 

oper = OperationFactory<int>::CreateOperate("+");  

oper->_numberA = 1;  

oper->_numberB = 2;  

cout<<oper->GetResult()<<endl;  

    getchar();

return 0;

 

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章