设计模式之工厂方法模式

来源:互联网 发布:美国历年gdp数据 编辑:程序博客网 时间:2024/06/05 01:10
定义:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法使一个类的实例化延迟到子类
个人觉得吧,简单点,就是有专门的工厂子类用来创建专门的产品
工厂方法 VS 简单工厂
简单工厂最大的优点就是在于工厂类包含了必要的逻辑判断,根据客户端的选择条件动态实例化相关的类,对于客户端来说,去除了与具体产品的依赖。
工厂方法模式就是把简单工厂里通过case语句判断的地方,转移到了子类里面,让子类去实例化,创建对象,也就是说工厂方法把简单工厂内部的逻辑判断移到了客户端来进行,以前你想要加功能,本来是要改工厂类里面的判断语句的,但是现在是修改客户端

这里为了和简单工厂模式结合起来,还是用加减乘除运算的这个例子吧,在这里会添加一个幂次方运算

#include<iostream>#include<cmath>using namespace std;//还是先写运算类,代码就抄之间简单工厂的了class Operation{public:virtual double getResult(){double result = 0;return result;}void setNumberA(int a){NumberA = a;}int getNumberA(){return NumberA;}void setNumberB(int b){NumberB = b;}int getNumberB(){return NumberB;}private:int NumberA;int NumberB;};//加法类,执行加法运算class AddOperation :public Operation{public:double getResult(){double result = 0;result = Operation::getNumberA() + Operation::getNumberB();return result;}};//减法类,执行减法运算class SubOperation :public Operation{public:double getResult(){double result = Operation::getNumberA() - Operation::getNumberB();return result;}};class MulOperation :public Operation{public:double getResult(){double result = Operation::getNumberA() * Operation::getNumberB();return result;}};class DivOperation :public Operation{public:double getResult(){if (Operation::getNumberB() == 0){cout << "除数为0,返回0" << endl;return 0;}double result = Operation::getNumberA()*1.0 / Operation::getNumberB();return result;}};//幂次方类class PowerOperation :public Operation{public:double getResult(){double result = 0;if (Operation::getNumberB() != 0){result = pow(Operation::getNumberA(), Operation::getNumberB());}return result;}};//工厂类class Factory{public:virtual Operation* getOperation() = 0;}; //加法工厂类class AddFactory :public Factory{public:Operation* getOperation(){return new AddOperation();}};//减法工厂类class SubFactory :public Factory{public:Operation* getOperation(){return new SubOperation();}};//乘法工厂类class MulFactory :public Factory{public:Operation* getOperation(){return new MulOperation();}};//除法工厂类class DivFactory :public Factory{public:Operation* getOperation(){return new DivOperation();}};//幂次方工厂类class PowerFactory :public Factory{public:Operation* getOperation(){return new PowerOperation();}};//客户端int main(void){//这里要选择创建哪一个类型的工厂Factory* factory = new AddFactory();Operation* oper = factory->getOperation();oper->setNumberA(10);oper->setNumberB(2);cout << oper->getResult() << endl;return 0;}
优点:

1、只需要知道具体工厂的名字,不用知道具体产品的名字,也不需要创建的具体细节

2、在系统增加新的产品时、只需要增加新的工厂子类和新的产品子类、符合了开闭原则

缺点:

1、每次增加一个产品的时候都要增加一个工厂类和一个产品类,这样会使类的数目增加的很快,在一定程度上增加了系统的复杂度

适用情况:

当你不知道开始的时候有多少个产品和产品的具体实现形式也不知道的时候可以考虑用工厂方法模式



原创粉丝点击