工廠方法模式
定義:定義一個用于創建對象的接口,讓子類決定實例化哪個類。工廠方法使一個類的實例化延遲到其子類。
適用性:
1、 當一個類不知道它所必須創建的對象的類的時候
2、 當一個類希望由它的子類來指定它所創建的對象的時候
3、 當類將創建對象的職責委托給多個幫助子類中的一個,并且你希望將哪一個幫助子類是代理者這一信息局部化的時候
優點:
1、 良好的封裝性
2、 良好的擴展性
3、 屏蔽了產品類,用戶不需要知道產品類的實例化過程。
4、 實現解耦,符合迪米特法則
實現:
class Product
{
public:
virtual void fun() = 0;
protected:
private:
};
class ConcreteProductA:public Product
{
public:
voidfun()
{
cout<<"ConcreteProductA"<
}
protected:
private:
};
class ConcreteProductB:public Product
{
public:
voidfun()
{
cout<<"ConcreteProductB"<
}
protected:
private:
};
class Creator
{
public:
virtualProduct *CreateProductMethod(int type) = 0;
protected:
private:
};
class ConcreteCreator:public Creator
{
public:
Product *CreateProductMethod(int type ) ;
protected:
private:
};
Product*ConcreteCreator::CreateProductMethod(int type)
{
switch(type)
{
case 0:
returnnew ConcreteProductA;
case 1:
returnnew ConcreteProductB;
default:
returnNULL;
}
}
如果不想創建Creator的子類,那么可以用模板類。
class Creator
{
public:
virtualProduct *CreateProductMethod() = 0;
protected:
private:
};
template
class TemplateCreator:public Creator
{
public:
Product *CreateProductMethod();
};
template
Product*TemplateCreator
{
return new T;
}
TemplateCreator
TemplateCreator
Product *pa = ACreator.CreateProductMethod();
Product *pb =BCreator.CreateProductMethod();
pa->fun();
pb->fun();
擴展:
1、簡單工廠方法;有時候我們并不需要把工廠類實例化。那么可以把Creator去掉,不要繼承,直接使用靜態方法。
class ConcreteCreator
{
public:
staticProduct *CreateProductMethod(int type ) ;
protected:
private:
};
Product*ConcreteCreator::CreateProductMethod(int type)
{
switch(type)
{
case 0:
returnnew ConcreteProductA;
case 1:
returnnew ConcreteProductB;
default:
returnNULL;
}
}
Product *pa =ConcreteCreator::CreateProductMethod(0);
Product *pb =ConcreteCreator::CreateProductMethod(1);
pa->fun();
pb->fun();