抽象工厂模式-对象创建模式
引言:
为了解决工厂模式可能带来的系统大量开销,我们可以进一步进行抽象,将一类对象创建放在一个工厂中。
类图:
类图各个部分介绍:
抽象工厂(Abstract Factory)角色:它声明了一组用于创建一族产品的
方法,每一个方法对应一种产品。
具体工厂(Concrete Factory)角色:它实现了在抽象工厂中声明的创
建产品的方法,生成一组具体产品,这些产品构成了一个产品族,每一个产品
都位于某个产品等级结构中。
抽象产品(Abstract Product)角色:它为每种产品声明接口,在抽象
产品中声明了产品所具有的业务方法。
具体产品(Concrete Product)角色:它定义具体工厂生产的具体产品
对象,实现抽象产品接口中声明的业务方法。
案例:
案例关系图:
案例代码:
#include<iostream>
using namespace std;
//苹果抽象类,供具体产地苹果实现
class AbstractApple
{
public:
virtual void getName() = 0;
};
//⾹香蕉抽象类,供具体产地⾹香蕉实现
class AbstractBanana
{
public:
virtual void getName() = 0;
};
class ChinaApple : public AbstractApple
{
public:
virtual void getName()
{
cout << "中国苹果" << endl;
}
};
class USAApple : public AbstractApple
{
public :
virtual void getName()
{
cout << "美国苹果" << endl;
}
};
class ChinaBanana : public AbstractBanana
{
public :
virtual void getName()
{
cout << "中国⾹香蕉" << endl;
}
};
class USABanana : public AbstractBanana
{
public:
virtual void getName()
{
cout << "美国⾹香蕉" << endl;
}
};
//抽象的⼯工⼚厂类,供具体产品族的⼯工⼚厂实现
class AbstractFactory
{
public:
virtual AbstractApple* createApple() = 0;
virtual AbstractBanana * createBanana() = 0;
};
class ChinaFactory : public AbstractFactory
{
public:
virtual AbstractApple* createApple()
{
return new ChinaApple;
}
virtual AbstractBanana * createBanana()
{
return new ChinaBanana;
}
};
class USAFactory : public AbstractFactory
{
public:
virtual AbstractApple* createApple()
{
return new USAApple;
}
virtual AbstractBanana * createBanana()
{
return new USABanana;
}
};
int main(void)
{
//现在准备要⼀一个中国的苹果,中国的⾹香蕉
AbstractApple* apple = NULL;
AbstractBanana* banana = NULL;
AbstractFactory* factory = NULL;
factory = new ChinaFactory;
//中国的苹果
apple = factory-‐>createApple();
//中国的⾹香蕉
banana = factory-‐>createBanana();
apple-‐>getName();
banana-‐>getName();
delete apple;
delete banana;
delete factory;
return 0;
}
小结:
以上案例中,我们将一类的对象实例化创建归结到一个具体的工厂中,之后创建一类的对象只需要调用对应的那一类对象创建工厂对象就可以了,当实例化对象增加时减少了系统的额外开销。