设计模式中工厂模式Factory专门负责将大量有共同接口的类实例化,被创建的实例通常都具有共同的父类。该模式可以让客户代码动态决定将哪一个类实例化,不必事先知道每次要实例化哪一个类,从而不用知道该类的具体类型。工厂模式有3种,简单工厂(Simple Factory)模式、工厂方法(Factory Method)模式和,抽象工厂(Abstract Factory)模式,本人介绍简单工厂(Simple Factory)模式。
简单工厂(Simple Factory)模式,又称为静态工厂模式。 下面用具体的代码来描述。
1、Product类:该类是所有要实例化的父类,提供共同接口Operation。
class Product
{
public:
virtual ~Product() = 0;
protected:
Product();
public:
virtual void Operation(void) = 0;
};
Product::Product()
{
;
}
Product::~Product()
{
;
}
2、CConcreteProduct:Product类的子类,实现Operation接口。
class ConcreteProduct : public Product
{
public:
ConcreteProduct();
~ConcreteProduct();
public:
virtual void Operation(void);
};
ConcreteProduct::ConcreteProduct()
{
cout<<"ConcreteProduct..."<<endl;
}
ConcreteProduct::~ConcreteProduct()
{
}
void ConcreteProduct::Operation(void)
{
cout<<"Hi,Operation!"<<endl;
}
3、Factory类:根据参数来创建具体类的实例。
enum PRODUCT_TYPE{PRODUCTA,PRODUCTB};
class Factory
{
public:
virtual ~Factory() = 0 ;
static Product * CreateProduct(PRODUCT_TYPE ptype); //看到Static了吗,这就是为什么又叫静态工厂模式的原因
protected:
Factory();
};
Factory::Factory()
{
;
}
Factory::~Factory()
{
;
}
Product * Factory::CreateProduct(PRODUCT_TYPE ptype)
{
if(PRODUCTA == ptype)
{
return new ConcreteProduct();
}
return NULL;
}
4、客户端代码:通过Factory来创建相关的类的实例。
Product *pro = Factory::CreateProduct(PRODUCTA);
pro->Operation(); //这里真正类型是ConcreteProduct
if(pro) //别忘了释放哦
{
delete pro;
pro = NULL;
}
从客户端代码我们看出,我们通过传入不同的参数给Factory类,Factory负责根据不同的参数创建具体子类的实例。因此我们在客户端代码看不到任何子类的具体类名,从而避免了跟具体的类的关联。