工厂模式,核心思路是将对象的实例化操作封装在一个工厂类,所有的对象都必须由这个“工厂”生产,巧妙地避免了满大街地出现new xxx()这种代码。
工厂模式有三种:简单工厂模式、方法工厂模式、抽象工厂模式。
简单工厂模式:
__interface IFruite
{
public:
virtual void Show()=0;
};
class CApple :public IFruite
{
public:
virtual void Show() { cout << "I'm an Apple" << endl; }
};
class CPear :public IFruite
{
public:
virtual void Show() { cout << "I'm a Pear" << endl; }
};
class CWatermelon :public IFruite
{
public:
virtual void Show() { cout << "I'm a Watermelon" << endl; }
};
class CFruitFactory
{
public:
enum Fruite_Type
{
FRUITE_APPLE,
FRUITE_PEAR,
FRUITE_WATERMELON
};
public:
static IFruite* CreateFruite(Fruite_Type eType)
{
IFruite* pFruite = NULL;
switch (eType)
{
case FRUITE_APPLE:
pFruite = new CApple();
break;
case FRUITE_PEAR:
pFruite = new CPear();
break;
case FRUITE_WATERMELON:
pFruite = new CWatermelon();
break;
default:
break;
}
return pFruite;
}
};
简单工厂模式的实现较为简单,只有一个水果工厂类,所有的水果生产过程都必须由这个水果工厂生产,工厂类内部用一个switch分支判断具体生产哪一种水果。
如果现在要增加一种水果,比如香蕉。除了增加一个香蕉类,还得必须修改工厂类,这就违背了开放封闭原则。
开放-封闭原则: 软件实体(类、模板、函数等等)可以扩展,但是不可以修改
方法工厂模式:
__interface IFruite
{
public:
virtual void Show()=0;
};
class CApple :public IFruite
{
public:
virtual void Show() { cout << "I'm an Apple" << endl; }
};
class CPear :public IFruite
{
public:
virtual void Show() { cout << "I'm a Pear" << endl; }
};
class CWatermelon :public IFruite
{
public:
virtual void Show() { cout << "I'm a Watermelon" << endl; }
};
__interface IFactory
{
public:
virtual IFruite* CreateFruite() = 0;
};
class CAppleFactory :public IFactory
{
public:
virtual IFruite* CreateFruite(){ return new CApple();}
};
class CPearFactory :public IFactory
{
public:
virtual IFruite* CreateFruite(){ return new CPear();}
};
class CWatermelonFactory :public IFactory
{
public:
virtual IFruite* CreateFruite(){ return new CWatermelon(); }
};
方法工厂模式符合开放-封闭原则:如果再增加一个香蕉类型,则需要增加一个香蕉类,和一个香蕉工厂类,而不需要修改任何类或函数。
但是,方法工厂模式为每一种水果都定义了一个工厂类,相比于简单工厂模式,工厂方法模式更容易造成类的泛滥。
最后,附上完整代码:
http://pan.baidu.com/s/1skBqnSx