1.说明
设计模式笔记开篇,在该系列笔记中,多参考和归纳与《大话设计模式》和《设计模式可复用面向对象软件的基础》,如果有侵权的嫌疑请以邮件通知我(zhang_int@sina.cn)以便及时撤下该系列文章。
该系列文章将遵循以下风格,模式说明,应用举例(选择),代码UML图,代码。文中代码在linux g++方式均编译通过并可执行。代码采用多文件方式,一个类为一个文件,如有读者未执行通过,请在评论区留言,以便及时修正。
如有未拖之处,欢迎各位读者指正,互相学习。
在阅读的时候,请理解UML结构,代码都是次要的。
2.简单工厂模式说明
本质:创建符合要求的对象。
在工厂模式中,通常由工厂类,产品基类接口类,产品类[产品类应该是对等平行的关系,不存在包含,组合的关系逻辑]。一个工厂可以生成多个产品,在客户端通过产品基类提供的公共接口来屏蔽产品的之间的差异。产品之间可以方便快速切换。
有时可能会根据需求类别,在工厂类中用switch进行判别,客户端只需要提出需求的类型即OK。
3.UML图
4.代码
#ifndef __CBASEPRODUCE_H
#define __CBASEPRODUCE_H
class CBaseProduct
{
public:
void setval(int first, int second)
{
m_valA = first;
m_valB = second;
}
virtual int handle() = 0;
public:
int m_valB;
int m_valA;
};
#endif
#ifndef __CADDPRODUCT_H
#define __CADDPRODUCT_H
#include "CBaseProduct.h"
class CAddProduct:public CBaseProduct
{
public:
int handle()
{
return m_valA + m_valB;
}
};
#endif
#ifndef __CMAXPRODUCT_H
#define __CMAXPRODUCT_H
#include "CBaseProduct.h"
class CMaxProduct:public CBaseProduct
{
public:
int handle()
{
int ret;
if (m_valA>m_valB)
ret = m_valA;
else
ret = m_valB;
return ret;
}
};
#endif
#ifndef __CMINPRODUCT_H
#define __CMINPRODUCT_H
#include "CBaseProduct.h"
class CMinProduct:public CBaseProduct
{
public:
int handle()
{
int ret;
if (m_valA < m_valB)
ret = m_valA;
else
ret = m_valB;
return ret;
}
};
#endif
#ifndef __COPERTFACTORY_H
#define __COPERTFACTORY_H
#include <iostream>
#include "CBaseProduct.h"
#include "CMaxProduct.h"
#include "CMinProduct.h"
#include "CAddProduct.h"
enum EOPERTYPE{OPERADD, OPERMAX, OPERMIN};
class COpertFactory
{
public:
CBaseProduct* create_product(EOPERTYPE type)
{
CBaseProduct* oper = NULL;
switch (type)
{
case OPERADD:
oper = new CAddProduct;
break;
case OPERMAX:
oper = new CMaxProduct;
break;
case OPERMIN:
oper = new CMinProduct;
break;
}
return oper;
}
};
#endif
#include <iostream>
#include "COperFactory.h"
#include "CBaseProduct.h"
int main(void)
{
COpertFactory* fact = new COpertFactory;
CBaseProduct* oper = fact->create_product(OPERADD);
oper->setval(10, 20);
std::cout<<"oper handle:"<<oper->handle()<<std::endl;
CBaseProduct* opermin = fact->create_product(OPERMIN);
opermin->setval(3, 5);
std::cout<<"oper min:"<<opermin->handle()<<std::endl;
CBaseProduct* opermax = fact->create_product(OPERMAX);
opermax->setval(100, 1000);
std::cout<<"oper max:"<<opermax->handle()<<std::endl;
delete oper;
delete opermin;
delete opermax;
delete face;
return 0;
}
。