您的位置:首页 > 编程语言 > C语言/C++

【C++】Chapter1:简单工厂模式

2010-04-28 23:45 225 查看
题目:实现计算器的输入2个数和运算符,得到结果



工程结构:

(1)头文件

COperationFactory.h(运算符工厂类)



(2)源文件

SimpleFactory.cpp(客户端应用类,主函数所在)



(3)运算类

COperation.cpp(运算符基类)
COperation.h
COperationAdd.h(加法运算符子类,继承于COperation)
COperationDiv.h (除法运算符子类,继承于COperation)
COperationMul.h (乘法运算符子类,继承于COperation)
COperationSub.h(减法运算符子类,继承于COperation)



============= 代码实现部分 =============



COperationFactory.h(运算符工厂类)

/************************************************************************/
/* 运算符工厂类 */
/************************************************************************/
#ifndef _OPERATION_FACTORY_H_
#define _OPERATION_FACTORY_H_

#include "stdafx.h"
#include "COperation.h"
#include "COperationAdd.h"
#include "COperationSub.h"
#include "COperationMul.h"
#include "COperationDiv.h"
#include "COperationFactory.h"

class COperationFactory
{
public:
    COperationFactory(){};
    ~COperationFactory(){};

    // 根据入参的不同,创建其对应的运算符类指针。就像是个工厂,创建用户指定的运算符类指针
    static COperation* NewOperation(const string& strOperate)
    {
        // 入参合法性判断,防止后面的strOperate[0]发生越界访问
        if (strOperate.size() != 1)
        {
            return NULL;
        }

        COperation* pOperation = NULL;
        switch (strOperate[0])
        {
        case '+':
            pOperation = new COperationAdd();
            break;
        case '-':
            pOperation = new COperationSub();
            break;
        case '*':
            pOperation = new COperationMul();
            break;
        case '/':
            pOperation = new COperationDiv();
            break;
        default:
            break;
        }

        return pOperation;
    };
};

#endif _OPERATION_FACTORY_H_




COperation.cpp(运算符基类)

#include "stdafx.h"
#include "COperation.h"

COperation::COperation()
    : _dNumA(0)
    , _dNumB(0)
{

}


COperation.h

/************************************************************************/
/* 运算符基类 */
/************************************************************************/

#ifndef _COPERATION_H_
#define _COPERATION_H_

class COperation
{
public:
    COperation();
    ~COperation(){};
        
    // 设置被运算数
    void SetNumA(double dNumA)
    {
        _dNumA = dNumA;
    };
    
    // 获取被运算数
    double GetNumA()
    {
        return _dNumA;
    };

    // 设置运算数
    void SetNumB(double dNumB)
    {
        _dNumB = dNumB;
    };

    // 获取运算数
    double GetNumB()
    {
        return _dNumB;
    };

    // 计算结果且在子类中实现各自的运算方法结果
    virtual double Result()
    {
        double dResult = 0;
        return dResult;
    }

private:
    double _dNumA;
    double _dNumB;
};

#endif _COPERATION_H_


COperationAdd.h(加法运算符子类,继承于COperation)

/************************************************************************/
/* 加法运算符子类,继承于运算符基类 */
/************************************************************************/
#ifndef _COPERATION_ADD_H_
#define _COPERATION_ADD_H_
#include "COperation.h"

 class COperationAdd : public COperation
 {
 public:
     COperationAdd(){};
     ~COperationAdd(){};

     double Result()
     {         
         return (GetNumA() + GetNumB());
     };    
 };

#endif _COPERATION_ADD_H_


COperationDiv.h (除法运算符子类,继承于COperation)

/************************************************************************/
/* 除法运算符子类,继承于运算符基类 */
/************************************************************************/
#ifndef _COPERATION_DIV_H_
#define _COPERATION_DIV_H_
#include "COperation.h"

class COperationDiv : public COperation
{
public:
    COperationDiv(){};
    ~COperationDiv(){};

    double Result()
    {
        double dResult = 0;
        if (0 != GetNumB())
        {
            dResult = (GetNumA() / GetNumB());
        }
        else
        {
            cout << "error: divisor is ";
        }
        return dResult;
    };    
};

#endif _COPERATION_DIV_H_


COperationMul.h (乘法运算符子类,继承于COperation)

/************************************************************************/
/* 乘法运算符子类,继承于运算符基类 */
/************************************************************************/
#ifndef _COPERATION_MUL_H_
#define _COPERATION_MUL_H_
#include "COperation.h"

class COperationMul : public COperation
{
public:
    COperationMul(){};
    ~COperationMul(){};

    double Result()
    {        
        return (GetNumA() * GetNumB());
    };    
};

#endif _COPERATION_MUL_H_


COperationSub.h(减法运算符子类,继承于COperation)

/************************************************************************/
/* 减法运算符子类,继承于运算符基类 */
/************************************************************************/
#ifndef _COPERATION_SUB_H_
#define _COPERATION_SUB_H_
#include "COperation.h"

class COperationSub : public COperation
{
public:
    COperationSub(){};
    ~COperationSub(){};

    double Result()
    {        
        return (GetNumA() - GetNumB());
    };    
};

#endif _COPERATION_SUB_H_






SimpleFactory.cpp(客户端应用类,主函数所在)

// SimpleFactory.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "COperationFactory.h"

int _tmain(int argc, _TCHAR* argv[])
{    
    // 通过运算符工厂创建加法运算
    COperation* OperAdd = COperationFactory::NewOperation("+");
    if (NULL != OperAdd)
    {
        OperAdd->SetNumA(168);  // 设置被加数
        OperAdd->SetNumB(105);  // 设置加数        
        cout << "168 + 105 = " << (OperAdd->Result()) << endl;
    }

    // 通过运算符工厂创建减法运算
    COperation* OperSub = COperationFactory::NewOperation("-");
    if (NULL != OperSub)
    {
        OperSub->SetNumA(168);  // 设置被减数
        OperSub->SetNumB(105);  // 设置减数        
        cout << "168 - 105 = " << (OperSub->Result()) << endl;
    }

    // 通过运算符工厂创建乘法运算
    COperation* OperMul = COperationFactory::NewOperation("*");
    if (NULL != OperMul)
    {
        OperMul->SetNumA(168);  // 设置被乘数
        OperMul->SetNumB(105);  // 设置乘数        
        cout << "168 * 105 = " << (OperMul->Result()) << endl;
    }

    // 通过运算符工厂创建除法运算
    COperation* OperDiv = COperationFactory::NewOperation("/");
    if (NULL != OperDiv)
    {
        OperDiv->SetNumA(168);  // 设置被除数
        OperDiv->SetNumB(105);  // 设置除数        
        cout << "168 / 105 = " << (OperDiv->Result()) << endl;
        
        OperDiv->SetNumB(0);    // 改变除数
        cout << (OperDiv->Result()) << endl;
    }

    // 阻止控制台进程结束,便于查看结果
    int nEnd = 0;
    cin >> nEnd;

	return 0;
}






总结:

(1)业务的封装:就是让业务逻辑与界面逻辑分开,让它们之间的耦合度下降,只有分离开,才可以达到容易维护或者扩展

(2)如果要修改任何一个运算符类的算法,都不需要提供其他运算符类算法的代码。

(3)用单独的类(COperationFactory)来做创造实例的过程,这就是工厂,简单运算工厂类。用户只需要输入运算符符号,工厂就实例化出合适的对象,通过多态,返回父类的方式实现了计算器的结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: