设计模式2(工厂模式)

来源:互联网 发布:tpp播放软件 编辑:程序博客网 时间:2024/05/16 05:13

工厂模式专门负责将大量有共同接口的类实例化。工厂模式可以动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类。工厂模式有以下几种形态:

 

简单工厂(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;

 

}

 

原创粉丝点击