1. 作用
抽象工厂:为创建一组相关或相互依赖的对象提供一个接口,而且无须指定它们的具体类。核心在于创建一组对象。
2. UML类图
参与者:
- Product:为一类产品声明一个接口。
- ConreteProduct:定义一个将被相应的具体工厂创建的产品对象。
- Factory:声明一组创建抽象产品对象的接口操作。
- ConcreteFactory:实现创建一组对象的接口。
3. 实现
- 举例:长虹和TCL是两个非常著名的家电牌子,两个厂家都要生产电视机和洗衣机,假设现在两家公司合并了,但是品牌还是独立,用程序实现合并后生产产品的情况。
- 类图:
代码:
#include <iostream>
using namespace std;
/*******产品抽象类***********/
/*电视机*/
class Tv
{
public:
virtual void showMe() = 0;
};
/*洗衣机*/
class Washer
{
public:
virtual void showMe() = 0;
};
/*******产品具体类***********/
/*长虹电视机*/
class ChangHTv :public Tv
{
public:
virtual void showMe()
{
cout << "长虹牌电视机\n";
}
};
/*长虹洗衣机*/
class ChangHWasher :public Washer
{
public:
virtual void showMe()
{
cout << "长虹牌洗衣机\n";
}
};
/*TCL电视机*/
class TCLTv :public Tv
{
public:
virtual void showMe()
{
cout << "TCL牌电视机\n";
}
};
/*TCL洗衣机*/
class TCLWasher :public Washer
{
public:
virtual void showMe()
{
cout << "TCL牌洗衣机\n";
}
};
/*******工厂抽象类***********/
class Factory
{
public:
virtual Tv* CreateTv() = 0;
virtual Washer* CreateWasher() = 0;
};
/*******具体工厂***********/
/***长虹工厂***/
class ChangHFactory:public Factory
{
public:
virtual Tv* CreateTv()
{
return new ChangHTv;
}
virtual Washer* CreateWasher()
{
return new ChangHWasher;
}
};
/***TCL工厂***/
class TCLFactory :public Factory
{
public:
virtual Tv* CreateTv()
{
return new TCLTv;
}
virtual Washer* CreateWasher()
{
return new TCLWasher;
}
};
/*****客户****/
void main()
{
//建长虹工厂
Factory *changhFac = new ChangHFactory;
//造产品
Tv *changhTv = changhFac->CreateTv();
changhTv->showMe();
Washer *changhWas = changhFac->CreateWasher();
changhWas->showMe();
//建TCL工厂
Factory *tclFac = new TCLFactory;
//造产品
Tv *tclFacTv = tclFac->CreateTv();
tclFacTv->showMe();
Washer *tclFacWas = tclFac->CreateWasher();
tclFacWas->showMe();
delete changhFac;
delete changhTv;
delete changhWas;
delete tclFac;
delete tclFacTv;
delete tclFacWas;
}
显示结果:
长虹牌电视机
长虹牌洗衣机
TCL牌电视机
TCL牌洗衣机
请按任意键继续. . .
4. 优缺点
- 优点:
封装性:同样将对象的创建过程与使用客户进行了隔离,知道接口就行。
产品级扩展简单:比如需要增加一个牌子,那么只需增加一个具体工厂即可,抽象工厂不变。 - 缺点:
产品族扩展复杂:如果需要在产品族中增加一个产品,比如冰箱,那么需要在抽象工厂和具体工厂中都增加生存冰箱的接口。
PS:产品族和产品级:上述Tv和Washer构成一个产品族,而ChangHong和TCL构成一个产品级,具体感觉需要自己体会。
5. 适用场景
一个对象族(或是一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。这里的约束可以理解为:Tcl厂生产出来的TV和Washer肯定是TCL牌的,而长虹厂生产出的TV和Washer肯定是长虹牌的。品牌就是对具体产品的约束。
6. 总结
抽象工厂是工厂模式的升级版,工厂模式解决了一种对象的创建问题(产品类只有一个抽象类),而抽象工厂解决了一组对象的创建问题,有多少产品抽象类工厂抽象类中就有多少个抽象工厂方法。