今天学了大话设计模式,书中第一章讲述了简单工厂模式,用的是C#来描述,于是我在学习之余将书中描述的内容以C++的形式重写一遍,以作加深自己的学习印象。


首先什么是“简单工厂模式”,应该是:用一个单独的类来做创造实例的过程。(大话设计模式P10)


书中用到的例子是小型的计算器,对应有多种操作算符。等待输入操作数和操作算符以后,根据输入的符号来生产用于计算的操作,这就是这次“简单工厂模式”的应用。


以下是我用C++描述的代码:

为简便我省略掉头文件和命名空间的声明。

//操作算符的抽象类
class Operation {
public:
    double numberA;    //2个操作数
    double numberB;
    virtual double GetResult() const = 0;    //用于计算的操作
};


以下分别是加法“+”、减法“-”、乘法“*”和除法“/”的操作定义

//加法
class OperationAdd : public Operation {
public:
    double GetResult() const {
        return numberA + numberB;
    }
};
//减法
class OperationSub : public Operation {
public:
    double GetResult() const {
        return numberA - numberB;
    }
};
//乘法
class OperationMul : public Operation {
public:
    double GetResult() const {
        return numberA * numberB;
    }
};
//除法,考虑到除数可能为0的情况,这里利用标准库的数值类numeric_limits<>来输出double的最大值。
class OperationDiv : public Operation {
public:
    double GetResult() const {
        if (numberB == 0)
            return numeric_limits<double>::max();
        else
            return numberA / numberB;
    }
};


操作算符都定义好以后,我们开始工厂类。

//工厂类
class OperationFactory {
public:
    static Operation* createOperation(char c) {
        switch (c) {
        case '+':
            return new OperationAdd();
        case '-':
            return new OperationSub();
        case '*':
            return new OperationMul();
        case '/':
            return new OperationDiv();
        }//利用switch来检测输入了哪个操作算符
    }
};


现在我们在客户端中测试一下以上的类。

int main() {
        //为了方便,以下都是没有检测输入的结果是否正确
    double numberA = 0, numberB = 0;
    char oper;
    cout << "请输入第一个操作数: ";
    cin >> numberA;
    cout << "请输入操作算符:";
    cin >> oper;
    cout << "请输入第二个操作数: ";
    cin >> numberB;
        //利用工厂类的静态方法创建出操作算符的对象
    Operation *operation = OperationFactory::createOperation(oper);
    operation->numberA = numberA;
    operation->numberB = numberB;
        //利用算符对象的方法得出结果
    cout << "结果为:" << operation->GetResult() << endl;
    return 0;
}


测试结果:

大话设计模式学习笔记-简单工厂模式(c++描述)_简单工厂模式 面向对象 学习笔记


相应的UML类图是:

大话设计模式学习笔记-简单工厂模式(c++描述)_简单工厂模式 面向对象 学习笔记_02


其实这样子把操作算符封装起来也有助于我们修改:

1、当我们需要修改除法或其他已有算法时,只需要修改相应的操作算法类即可,不必涉及到其他的操作。

2、当我们需要添加新的算法时,只需要提添加相应的新类,和在工厂类中增添switch,便可以轻松修改功能。