个人理解主要是定义了创建对象的接口,封装了子类创建的细节,不需要在客户代码中出现例如:new 子类,这样的书写,同时使得具体化类的工作延迟到了子类中。
Uml图
简单的代码实现(实现直接作为内联实现了,大致说明思想):
class Product
{
public:
virtual ~Product() = 0{}
protected:
Product(){}
};
class ConcreteProduct : public Product
{
public:
ConcreteProduct(){cout<<"创建成功"<<endl;}
~ConcreteProduct(){}
};
class Factory
{
public:
virtual ~Factory() = 0{}
virtual Product* CreateProduct() = 0;
protected:
Factory(){}
};
class ConcreteFactory : public Factory
{
public:
ConcreteFactory(){}
~ConcreteFactory(){}
Product* CreateProduct()
{
return new ConcreteProduct;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Factory* fac = new ConcreteFactory;
Product* p = fac->CreateProduct();
delete fac;
delete p;
//这里产品的销毁可以delete,更好的是在工厂中创建一个方法用来销毁
return 0;
}
工厂模式也会带来一些问题:
如果为每个具体的产品类实例化提供一个函数,则必须新建一个方法来处理这个新建的ConcreteProduct,这样Factory接口永远不能封闭。也可以通过创建子类的方法实现,但这是以新建一个类作为代价的。
实现中可以通过参数化工厂方法,即通过传入一个参数来决定创建具体哪一个Product的子类,方法就是将具体的Product类作为模板参数,类似这样Factory<Product>。
Factory模式仅仅局限于一类类(具体的Product有共同基类),如果要为不同类的类提供一个对象创建的接口,那就要用到下节提到的AbstractFactory模式了。