设计模式C++版_1_简单工厂模式

本文是学习设计模式的学习笔记,文中引用了如下作者(书籍、博客)的内容,实例程序在《设计模式C++版》的基础上有所改动,特此声明。

Peixing Yang的《大话设计模式C++源代码》
程杰的《大话设计模式》
K_Eckel的《设计模式C++版》 http://k-eckel.cnblogs.com/
EoF的<设计模式_可复用面向对象软件的基础>
cbf4life的《24种设计模式介绍与6大设计原则》 http://cbf4life.iteye.com/

1. 应用场景
    1.1 当有若干功能相似的类,各类之间并没有耦合,可以用简单工厂来实现这些类的实例化。当添加新的类的时候,不影响现有的代码。
    1.2 父类并不知道具体要实例化哪一个具体的子类。
2. 功能
    2.1 定义创建对象的接口,封装了对象的创建。
    2.2 使得具体化类的工作延迟到了子类中。
3. 核心思想
    用一个工厂来根据输入的条件来产生不同的类的对象,然后根据不同类的virtual函数得到不同的结果。
4. 优点
    适用于不同情况创建不同类的对象时。
5. 缺点
    客户端必须要知道基类和工厂类,耦合性差
6. 实例
    设计一个计算器,要求可以进行简单的加减乘除运算。
    6.1 设计类图
        
    6.2 程序示例
6.2.1 OperationBase.h (各种运算类)
// class section
namespace Operation
{
    class COperationBase
    {
    public:
        COperationBase(void)
        {
            m_first_num = 0.0;
            m_second_num = 0.0;
        }
        ~COperationBase(void) 
        {

        }

        inline void SetFirstNum(const double a_first_num)
        {
            this->m_first_num = a_first_num;
        }

        inline void SetSecondNum(const double a_second_num)
        {
            this->m_second_num = a_second_num;
        }

        inline double GetFirstNum()
        {
            return this->m_first_num;
        }

        inline double GetSecondNum()
        {
            return this->m_second_num;
        }

        inline virtual const double GetResult() = 0;
        
    private:
        
        double m_first_num;
        double m_second_num;
    };

    class CAddOperation : public COperationBase
    {
    public:
        inline virtual const double GetResult()
        {
            DEBUG("CAddOperation");
            return GetFirstNum() + GetSecondNum();
        }
    };

    class CSubOperation : public COperationBase
    {
    public:
        inline virtual const double GetResult()
        {
            DEBUG("CSubOperation");
            return GetFirstNum() - GetSecondNum();
        }
    };

    class CMulOperation : public COperationBase
    {
    public:
        inline virtual const double GetResult()
        {
            DEBUG("CMulOperation");
            return GetFirstNum() * GetSecondNum();
        }
    };

    class CDivOperation : public COperationBase
    {
    public:
        inline virtual const double GetResult()
        {
            DEBUG("CDivOperation");
            if (0 == GetSecondNum())
            {
                DEBUG("Second num is 0.");
                return -1;
            }
            return GetFirstNum() / GetSecondNum();
        }
    };


}

6.2.2 CalculatorFactory.h (计算器工厂类)
#include "OperationBase.h"
namespace Factory
{
    class CCalculatorFactory
    {
    public:
        CCalculatorFactory(void);
        ~CCalculatorFactory(void);

        static Operation::COperationBase *Create(char a_operator);
    };
}
6.2.3 CalculatorFactory.cpp(计算器工厂类实现)
#include "CalculatorFactory.h"


Factory::CCalculatorFactory::CCalculatorFactory(void)
{
}


Factory::CCalculatorFactory::~CCalculatorFactory(void)
{
}

Operation::COperationBase* Factory::CCalculatorFactory::Create(char a_operator)
{
    Operation::COperationBase *operation;
    switch (a_operator)
    {
    case '+':
        {
            operation = new Operation::CAddOperation();
            break;
        }
    case '-':
        {
            operation = new Operation::CSubOperation();
            break;
        }
    case '*':
        {
            operation = new Operation::CMulOperation();
            break;
        }
    case '/':
        {
            operation = new Operation::CDivOperation();
            break;
        }
    default:
        {
            break;
        }
    }
    return operation;
}

6.2.4 main 
#include <iostream>
#include "OperationBase.h"
#include "CalculatorFactory.h"

int main(int argc, char **argv)
{
    double first_num = 0;
    double sec_num = 0;
    char opertor = 0;
    double ret = 0;
    while(1)
    {
        fflush(stdin);
        std::cin >> first_num >> opertor >> sec_num;
        Operation::COperationBase *oper = Factory::CCalculatorFactory::Create(opertor);
        if (NULL == oper)
        {
            break;
        }
        oper->SetFirstNum(first_num);
        oper->SetSecondNum(sec_num);

        std::cout << oper->GetResult() << std::endl;
        if (NULL != oper)
        {
            delete(oper);
        }
    }
    
    return 0;
}

6.3  简单工厂UML类图































    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值