研究了一下大话设计模式,顺手吧简单工厂模式的c++版本写出来了,放上来分享一下
/*简单工厂模式 *by clh01s@163.com 2017年7月11日 */ #include <iostream> #include <string> using namespace std; //基础操作类,加法类,减法类,乘法类,除法类的父类 class Operation { public: double get_num_a(){return _number_a;} double get_num_b(){return _number_b;} void set_num_a(double a){_number_a = a;} void set_num_b(double b){_number_b = b;} //虚函数 virtual double GetResult() { double result = 0; return result; } private: double _number_a; double _number_b; }; //加法类 class OperationAdd:public Operation { public: //重写虚函数GetResult double GetResult() override { double result = get_num_a() + get_num_b(); return result; } }; //减法类 class OperationSub:public Operation { public: //重写虚函数GetResult double GetResult() override { double result = get_num_a() - get_num_b(); return result; } }; //乘法类 class OperationMul:public Operation { public: //重写虚函数GetResult double GetResult() override { double result = get_num_a() * get_num_b(); return result; } }; class OperationDiv:public Operation { public: //重写虚函数GetResult double GetResult() override { if(0 == get_num_b()) { //除数不能为0 return -1; } double result = get_num_a() / get_num_b(); return result; } }; //工厂类,根据运算符的不同创造不同的实例 class OperationFactory { public: //将运算符转换成switch可以识别的int类型 int transform(string oper) { if("+" == oper) { return 0; }else if("-" == oper) { return 1; }else if("*" == oper) { return 2; }else { return 3; } } //创建实例函数,根据操作符返回相应的操作Operation类的指针 Operation *createOperate(string operate) { Operation *oper; switch(transform(operate)) { case 0: oper = new OperationAdd(); break; case 1: oper = new OperationSub(); break; case 2: oper = new OperationMul(); break; case 3: oper = new OperationDiv(); break; } return oper; } }; int main() { //创建一个运算类的指针 Operation *oper; //创建一个工厂类的实例 OperationFactory create; //接受工厂类返回的不同操作类的地址 oper = create.createOperate("+"); //设置两个数 oper->set_num_a(9.154); oper->set_num_b(11.3); //完成运算 double result = oper->GetResult(); cout<<"9.154+11.3="<<result<<endl; return 0; }结果输出
$ g++ factory.cpp -std=c++11 $ ./a.out 9.154+11.3=20.454工厂模式的优缺点(摘自《设计模式》): 优点: 1.它分离了具体的类,将客户与类的实现分离.产品类名也在具体的工厂的实现中被分离;它们不会出现在客户代码中. 2.它使得易于交换产品系列.一个具体的工厂类在应用中仅出现一次即它初始化的时候.这使得改变一个类变得很容易. 3.有利于产品的一致性.当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要. 缺点: 1.难以支持新种类产品.难以扩展抽象工厂以生产新种类的产品.因为工厂类的接口确定了可以被创建的产品集合.支持新种类的产品就需要扩充该工厂的接口.这将涉及工厂类及其所有子类的改变.
转载请注明出处:http://blog.csdn.net/clh01s/article/details/74991526