标签:工厂方法模式 factory method 设计模式 c++ 大话设计模式
工厂方法模式是以简单工厂模式为基础的,如果未了解简单工厂模式的同学可先浏览《大话设计模式C++版——简单工厂模式》。在简单工厂模式中,提到过简单工厂模式的缺陷,即违背了开发—封闭原则,其主要原因是由于switch的判断结构的使用,使修改或添加新的对象时需要改动简单工厂类的代码,不符合开放—封闭原则,那么工厂方法模式会在那方面有所改进呢?我们仍以简单工厂模式中加减法计算器为例。
1、保持简单工厂模式的 IOperation 接口和实现对象(COperation_Add 和 COperation_Dec)
class IOperation
{
public:
IOperation() : m_nNuml(0), m_nNumr(0) {}
virtual ~IOperation() {}
virtual void SetNum(int nNuml = 0, int nNumr = 0)
{
m_nNuml = nNuml;
m_nNumr = nNumr;
}
virtual int CalculateResult() = 0;
protected:
int m_nNuml, m_nNumr;
};
class COperation_Add : public IOperation
{
public:
int CalculateResult()
{
return m_nNuml + m_nNumr;
}
};
class COperation_Dec : public IOperation
{
public:
int CalculateResult()
{
return m_nNuml - m_nNumr;
}
};class IOperationFactory
{
public:
virtual ~IOperationFactory() {}
virtual IOperation* CreateOperation() = 0;
};
class COperationFactory_Add : public IOperationFactory
{
public:
IOperation* CreateOperation()
{
return new COperation_Add();
}
};
class COperationFactory_Dec : public IOperationFactory
{
public:
IOperation* CreateOperation()
{
return new COperation_Dec();
}
};3、使用工厂方法模式
void Test()
{
IOperationFactory* poIOperationFactory = new COperationFactory_Add();
IOperation* poIOperation = NULL;
if (!poIOperationFactory)
{
return;
}
poIOperation = poIOperationFactory->CreateOperation();
if (poIOperation)
{
poIOperation->SetNum(2, 3);
printf("2 + 3 = %d\n", poIOperation->CalculateResult());
delete poIOperation;
}
delete poIOperationFactory;
}那么问题来了,如果用户要计算乘法了,简单工厂的方式是在简单工厂类中增加一个switch,同时改动用户调用简单工厂接口的符号,即需要改变2处代码,工厂方法模式则需要新增一个生产乘法计算器的工厂类,同时将 poIOperationFactory 改为该工厂new出的对象,即增加一处代码(乘法工厂类),修改一处代码,实际上还是不完全符合开方—封闭原则,但工厂方法模式的改进之处在于,它将简单工厂类修改switch结构的方式改为增加乘法工厂类了,而增加(扩展)是允许的,所以工厂方法模式虽然也要修改代码,但改动减少,这就是工厂方法模式比简单工厂模式的牛X那么一点点的地方。
标签:工厂方法模式 factory method 设计模式 c++ 大话设计模式
原文地址:http://blog.csdn.net/gufeng99/article/details/46484479