看书看到这个模型的时候,马上想到了之前学到的简单工厂模式,然后看了一下例子,觉得假如同样对于计算器来说的话,貌似简单工厂模式灵活一点,因为工厂类里包含了相关的逻辑判断。起码对于客户端而言,可以动态地选择条件来实例化相关的类。而工厂模式,貌似虽然使添加方法更加灵活,但是判断要实例化相关类的时候,却要在客户端里写判断逻辑。
工厂方法模式(Factory Method)在书中的定义为:定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂方法是一个类的实例化延迟到其子类。
以下是实践书中的代码:
// 工厂方法.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
using namespace std;
class Operation
{
public:
double numberA;
double numberB;
virtual double GetResult() = 0;
};
/**********************************************/
class OperationAdd : public Operation
{
public:
double GetResult()
{
double result = 0.0;
result = numberA + numberB;
return result;
}
};
class OperationSub : public Operation
{
public:
double GetResult()
{
double result = 0.0;
result = numberA - numberB;
return result;
}
};
class OperationMul : public Operation
{
public:
double GetResult()
{
double result = 0.0;
result = numberA * numberB;
return result;
}
};
class OperationDiv : public Operation
{
public:
double GetResult()
{
double result = 0.0;
if(numberB == 0)
cout<<"除数不能为0";
else
result = numberA / numberB;
return result;
}
};
class IFactory
{
public:
virtual Operation *CreateOperation() = 0;
};
class AddFactory : public IFactory
{
public:
Operation *CreateOperation()
{
return new OperationAdd();
}
};
class SubFactory : public IFactory
{
public:
Operation *CreateOperation()
{
return new OperationSub();
}
};
class MulFactory : public IFactory
{
public:
Operation *CreateOperation()
{
return new OperationMul();
}
};
class DivFactory : public IFactory
{
public:
Operation *CreateOperation()
{
return new OperationDiv();
}
};
/************************************************/
int _tmain(int argc, _TCHAR* argv[])
{
IFactory *operFactory = new AddFactory();
Operation *oper = operFactory->CreateOperation();
oper->numberA = 1;
oper->numberB = 1;
oper->GetResult();
cout<<"a="<<oper->numberA<<endl;
cout<<"b="<<oper->numberB<<endl;
cout<<"result="<<oper->GetResult();
system("pause");
return 0;
}
简单工厂的最大优点在于工厂类包含了必要的逻辑判断,从而去除了客户端与具体类的依赖,只需要根据需求传入一个“+”就会生成相关的类来执行相应的操作。但是也有一个缺点,就是如果我们要添加其他的方法,我们必须添加一个方法类,然后再修改工厂类里的逻辑判断,这样违反了开放-封闭原则。而工厂方法模式,则虽然把逻辑判断转移到客户端,但是它在添加方法的时候没有修改原来的工厂类,只是扩展需要添加的方法类而已,这个满足开放-封闭原则,而且还保持了封装对象创建过程的优点。但是这样就增加了客户端的压力。所以说,工厂方法应该是简单工厂的优化。在以后的学习过程中慢慢体会吧!!