C++设计模式之工厂方法模式(Factory Method)

来源:互联网 发布:php输出中文乱码 编辑:程序博客网 时间:2024/06/07 02:01
工厂方法模式


1.意图:
定义一个用于创建对象的接口,让子类决定实例化哪一个类。Factory Method使一个类的实例化延迟到其子类。又叫虚拟构造子(Virtual Constructor)模式或者多态性工厂(Polymorphic Factory)模式。                           
2.适用性:
a.当一个类不知道它所必须创建的对象的类的时候。
b.当一个类希望由它的子类来指定它所创建的对象的时候。
c.当类将创建对象的职责委托给多个帮助子类中的某一个,并且你希望将哪一个帮助子类是代理者这一信息局部化的时候。
3.分析说明:
工厂模式是一个创建性的模式,他要求工厂类和产品类分开,
由一个工厂类可以根据传入的参量决定创建出哪一种产品类的实例。但这些不同的实例有共同的父类。
Factory  Method 把创建的这些实例的具体过程封装起来。当一个类无法预料将要创建哪种类的对象或是一个类需要由子类来指定创建的对象时,需要用到工厂方法模式。
4.类图分析:
a.工厂(Factory Method)模式结构如图1所示说明。工厂模式涉及到抽象工厂角色、具体工厂角色、抽象产品角色以及具体产品角色等。
b.抽象工厂(Creator)角色:任何在模式中创建对象的工厂类必须实现这个接口。在实际的系统中,这个角色也常常使用抽象类或接口实现。
c.具体工厂(Concrete Creator)角色:担任这个角色的是实现了抽象工厂接口的具体类。具体工厂角色含有与应用密切相关的逻辑,并且受到应用程序的调用以创建产品对象。在实际的系统中这个角色使用具体类实现。
d.抽象产品(Product)角色:工厂方法模式所创建的对象的超类型,也就是产品对象的共同父类或共同拥有的接口。在实际的系统中,这个角色也常常使用抽象类或者接口来实现。
e.具体产品(Concrete Product)角色:这个角色实现了抽象产品角色所声明的接口。工厂方法模式所创建的每一个对象都是某个具体产品角色的实例。这个角色使用具体类来实现。

5.C++代码实现:
#include<iostream>
using namespace std;


//定义产品类 
class  Product{
protected:
private:
public:
Product()//构造函数 
{
cout<<"调用了产品类的构造函数!"<<endl;
}
virtual void Productfun()
{
cout<<"调用了产品基类的基本信息函数!"<<endl;

virtual ~Product()
{
cout<<"调用了Product基类的析构函数!"<<endl; 

/*1.把析构函数申明为虚函数时不会发生内存泄露*/ 
/*2.当把一个析构函数申明为纯虚函数时,必须在类外提供纯虚析构函数的定义:
 Product::~Product() {}  纯虚析构函数的定义*/
/*3.virtual ~Product(){} 或者是这种形式*/
};
//定义具体产品类1
class ConcreteProduct1:public Product{
protected:
private:
public:
ConcreteProduct1()
{
cout<<"调用了具体产品类1的构造函数!"<<endl;
}
virtual void Productfun()
{
cout<<"具体产品类1的基本信息函数!"<<endl;

~ConcreteProduct1()
{
cout<<"调用了具体产品类1的析构函数!"<<endl;
}  
};


//定义具体产品类2
class ConcreteProduct2:public Product{
protected:
private:
public:
ConcreteProduct2()
{
cout<<"调用了具体产品类2的构造函数!"<<endl;
}
virtual void Productfun()
{
cout<<"调用了具体产品类2的基本信息函数!"<<endl;

~ConcreteProduct2()
{
cout<<"调用了具体产品类2的析构函数!"<<endl;
}  
};


//定义工厂类 
class  Factory{
protected:
private:
public:
Factory()//构造函数 
{
cout<<"调用了工厂类的构造函数!"<<endl;
}
void Factoryfun()
{
cout<<"调用了工厂类的基本信息函数!"<<endl;

/*申明一个纯虚函数,相当于创建了一个用于创建对象的接口*/
virtual Product* CreateProduct()
{
//创建基类接口 
return new Product();
/*
此时产品类中不能含有纯虚函数,因为纯虚函数不能创建对象 
*/

virtual ~Factory()
{
cout<<"调用了Factory基类的析构函数!"<<endl;

};
//定义具体工厂类1
class ConcreteFactory1:public Factory{
protected:
private:
public:
ConcreteFactory1()
{
cout<<"调用了具体工厂类1的构造函数!"<<endl;

Product* CreateProduct()
{
/*创建派生类1接口*/
return new ConcreteProduct1();
}
~ConcreteFactory1()
{
cout<<"调用了具体工厂类1的析构函数!"<<endl;
}  
};
//定义具体工厂类2
class ConcreteFactory2:public Factory{
protected:
private:
public:
ConcreteFactory2()
{
cout<<"调用了具体工厂类2的构造函数!"<<endl;

Product* CreateProduct()
{
/*创建派生类2接口*/
return new ConcreteProduct2();
}
~ConcreteFactory2()
{
cout<<"调用了具体工厂类2的析构函数!"<<endl;
}  
};
int main(void)
{
/*有两个具体工厂类,可以选择创建哪一个*/
Factory* fac = new ConcreteFactory2();//创建一个具体工厂类1 
Product* bd = fac->CreateProduct();//多态创建,用具体工厂类来调用具体产品类 
fac->Factoryfun();//调用Factory基类函数 
bd->Productfun();//多态调用 
delete fac; 
delete bd;
return 0;
}
0 0