今天学了大话设计模式,书中第一章讲述了简单工厂模式,用的是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;
}

测试结果:
相应的UML类图是:
其实这样子把操作算符封装起来也有助于我们修改:
1、当我们需要修改除法或其他已有算法时,只需要修改相应的操作算法类即可,不必涉及到其他的操作。简单工厂模式
2、当我们需要添加新的算法时,只需要提添加相应的新类,和在工厂类中增添switch,便可以轻松修改功能。
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-34579-1.html
台湾如果收回
你觉得我是不是该更新下