?!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
工厂Ҏ模式
定义Q定义一个用于创建对象的接口Q让子类军_实例化哪个类。工厂方法一个类的实例化延迟到其子类?/p>
适用性:
1?当一个类不知道它所必须创徏的对象的cȝ时?/p>
2?当一个类希望由它的子cL指定它所创徏的对象的时?/p>
3?当类创建对象的职责委托l多个帮助子cM的一个,q且你希望将哪一个帮助子cL代理者这一信息局部化的时?/p>
优点Q?/strong>
1?良好的封装?/p>
2?良好的扩展?/p>
3?屏蔽了品类Q用户不需要知道品类的实例化q程?/p>
4?实现解耦,W合q米Ҏ?/p>
实现Q?/p>
class Product
{
public:
virtual void fun() = 0;
protected:
private:
};
class ConcreteProductA:public Product
{
public:
voidfun()
{
cout<<"ConcreteProductA"<<endl;< p="" style="margin: 0px; padding: 0px;">
}
protected:
private:
};
class ConcreteProductB:public Product
{
public:
voidfun()
{
cout<<"ConcreteProductB"<<endl;< p="" style="margin: 0px; padding: 0px;">
}
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的子c,那么可以用模板类?/p>
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();
扩展Q?/strong>
1、简单工厂方法;有时候我们ƈ不需要把工厂cd例化。那么可以把CreatorLQ不要承,直接使用静态方法?/p>
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();