前段时间比较忙,一直没时间看设计模式,原本计算也被打乱了,只能有空时学习一下,从最简单的简单工厂模式开始吧
1、什么是简单工厂模式
简单工厂模式属于创建型模式,是由一个工厂对象决定创建出哪一类产品类的实例,其实质就是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类的实例
2、实例
下面的代码功能主要是实现一个工厂类,工厂类根据传入的运算符,创建出相应的加法/减法类实例。
首先是创建一个父类运算类:运算类只有两个变量numbeA和numberB,同时构造函数初始化变量值,然后就是一个虚函数,后续由子类实现对应的功能。
//运算类 class Operation { public: double NumberA; double NumberB; //构造函数,初始化 Operation() { NumberA = 2.0; NumberB = 1.0; } //虚函数 virtual double GetResult() { double result = 0; return result; } };
然后创建减法类和加法类,继承运算类,实现加法和减法:
//继承运算类的加法类 class OperationAdd : public Operation { double GetResult() { double result = 0; result = NumberA + NumberB; return result; } }; //继承运算类的减法类 class OperationSub : public Operation { double GetResult() { double result = 0; result = NumberA - NumberB; return result; } };
最后创建工厂类,完成根据运算符创建对应加法/减法实例
//生成实例的工厂类 class OperationFactory { public: static Operation* CreateOperate(char operate) { Operation * oper = NULL; switch(operate) { case '+': oper = new OperationAdd(); break; case '-': oper = new OperationSub(); } return oper; } };
客户端代码为
//客户端 int main() { //工厂类对象指针 OperationFactory* factoryA = new OperationFactory(); double resultAdd = 0; double resultSub = 0; //传入运算符'-' char operate = '-'; resultSub = factoryA->CreateOperate(operate)->GetResult(); //传入运算符'+' operate = '+'; resultAdd = factoryA->CreateOperate(operate)->GetResult(); cout << resultAdd << " "<< resultSub <<endl; //结果为3 1 getchar(); return 0; }
3、优缺点
这是一个很好理解的工厂模式实例,工厂模式很好地将业务和界面分离开,如果需要增加其他运算如乘法、除法、开方、平方等运算,只需要增加相应的乘法类、除法类等等,同时在工程类的分支中加入对应类的实例创建分支,对于客户端来讲,业务逻辑是不可见的。但同样也有一定的缺点,由于所有的运算子类实例创建都在一个工厂类中,违背了高内聚原则,如果需要增加其他类,那么必须要改动工厂类的内部实现,并且虽则功能的不断增多,子类增加,判断也增加对系统的维护和扩展不利。