工厂方法模式
定义:定义一个用于创建对象的接口,让子类决定实例化哪个类。工厂方法使一个类的实例化延迟到其子类。
适用性:
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();