1.简单工厂模式

来源:互联网 发布:盈建科结构设计软件 编辑:程序博客网 时间:2024/06/07 14:28

1.说明
设计模式笔记开篇,在该系列笔记中,多参考和归纳与《大话设计模式》和《设计模式可复用面向对象软件的基础》,如果有侵权的嫌疑请以邮件通知我(zhang_int@sina.cn)以便及时撤下该系列文章。
该系列文章将遵循以下风格,模式说明,应用举例(选择),代码UML图,代码。文中代码在linux g++方式均编译通过并可执行。代码采用多文件方式,一个类为一个文件,如有读者未执行通过,请在评论区留言,以便及时修正。
如有未拖之处,欢迎各位读者指正,互相学习。
在阅读的时候,请理解UML结构,代码都是次要的。
2.简单工厂模式说明
本质:创建符合要求的对象。
在工厂模式中,通常由工厂类,产品基类接口类,产品类[产品类应该是对等平行的关系,不存在包含,组合的关系逻辑]。一个工厂可以生成多个产品,在客户端通过产品基类提供的公共接口来屏蔽产品的之间的差异。产品之间可以方便快速切换。
有时可能会根据需求类别,在工厂类中用switch进行判别,客户端只需要提出需求的类型即OK。
3.UML图

4.代码

#ifndef __CBASEPRODUCE_H#define __CBASEPRODUCE_Hclass 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;}

0 0