一、简单工厂的定义
简单工厂模式属于创建型模式又叫做静态工厂方法模式,它属于类创建型模式。简单工厂模式专门定义一个根据参数来返回不同类的实例的函数,来负责创建其他类的实例,被创建的实例通常都具有共同的父类。
二、简单工厂的优缺点
- 优点
- 工厂类承担了客户端创建对象的责任,用户只需提供相应的参数就能创建自己所需要的产品,不需要知道具体细节。可以在不修改客户端代码的情况下,修改和增加新的具体产品类。
- 缺点
- 不符合开闭原则,一旦增加新的类,则需要修改单工厂类中的逻辑。系统的所有逻辑都在工厂类中,一旦工厂类出现问题,则整个系统都将无法工作。
三、简单工厂的实现
下面提供一个用简单工厂实现的计算器,其中提供一个工厂类 —— 简单工厂类,用于实例化对象;抽象类 —— 计算类,用于实现多态;以及他的派生类 —— 加、减、乘、除类,用于实现具体的逻辑。
- UML类图
- 计算类
class Calculation { public: virtual double GetResult()=0; double numberA; double numberB; };
- 加法类
class Add :public Calculation { virtual double GetResult() { return numberA + numberB; } };
- 减法类
class Sub:public Calculation { virtual double GetResult() { return numberA - numberB; } };
- 乘法类
class Mult:public Calculation { virtual double GetResult() { return numberA * numberB; } };
- 除法类
class Div:public Calculation { virtual double GetResult() { if (numberB==0) { throw new exception("除数不能为0"); } return numberA / numberB; } };
- 简单工厂类
class Factory { public: static Calculation* createCalculation(char str) { Calculation* calc = nullptr; switch (str) { case '+': calc = new Add(); break; case '-': calc = new Sub(); break; case '*': calc = new Mult(); break; case '/': calc = new Div(); break; default: cout << "请输入正确的运算符" << endl; break; } return calc; } };
- 客户端
Calculation* cal = Factory::createCalculation('/'); cal->numberA = 20; cal->numberB = 10; double result=0; try { result = cal->GetResult(); } catch (exception* e) { cout<<e->what()<<endl; } cout << result; return 0;