抽象工厂模式的主要角色如下:
抽象工厂(Abstract Factory):提供了创建产品的接口,它包含多个创建产品的方法 newProduct(),可以创建多个不同等级的产品。
具体工厂(Concrete Factory):主要是实现抽象工厂中的多个抽象方法,完成具体产品的创建。
抽象产品(Product):定义了产品的规范,描述了产品的主要特性和功能,抽象工厂模式有多个抽象产品。
具体产品(ConcreteProduct):实现了抽象产品角色所定义的接口,由具体工厂来创建,它 同具体工厂之间
主要解决:主要解决接口选择的问题,多个工厂,多个产品,并且每个产品可以包含多个型号。虚基类的方式构建。每一个工厂类可以生产同一个产品的多个型号。
何时使用:系统的产品有多于一个的产品族,而系统只消费其中某一族的产品。
如何解决:在一个产品族里面,定义多个产品。
关键代码:在一个工厂里聚合多个同类产品。
缺点:产品族扩展非常困难,要增加一个系列的某一产品,既要在抽象的 Create里加代码,又要在具体的里面加代码。是多对一的关系。
场景:比如车有2驱、4驱,2驱有卡罗拉、雷凌,4驱有汉兰达 、霸道。生产车的厂家有 一汽丰田,还有广汽丰田,他们分别生产2驱,4驱。代码如下:
//定义抽象类
class car_two
{
public:
virtual void show() = 0;
};
//定义具体类
class kaluola :public car_two
{
public:
void show();
};
class leilin :public car_two
{
public:
void show();
};
//定义抽象类
class car_four
{
public:
virtual void show() = 0;
};
//定义具体类
class hanlanda :public car_four
{
public:
void show();
};
class padao :public car_four
{
public:
void show()
};
class Factory
{
public:
virtual car_two *creat1() = 0;
virtual car_four *creat2() = 0;
};
class guangqi:public Factory
{
public:
car_two *creat1(){ return new leilin(); }
car_four *creat2(){ return new hanlanda(); }
};
class yiqi:public Factory
{
public:
car_two *creat1(){ return new kaluola(); }
car_four *creat2(){ return new padao(); }
};
int _tmain(int argc, _TCHAR* argv[])
{
Factory *factory = new guangqi ();
factory->creat1()->show();
factory->creat2()->show();
factory = new yiqi();
factory->creat1()->show();
factory->creat2()->show();
return 0;
}
抽象工厂模式的优点:
抽象工厂模式除了具有工厂方法模式的优点外,最主要的优点就是可以在类的内部对产品族进行约束。所谓的产品族,一般或多或少的都存在一定的关联,抽象工厂模式就可以在类内部对产品族的关联关系进行定义和描述,而不必专门引入一个新的类来进行管理。
抽象工厂模式的缺点:
产品族的扩展将是一件十分费力的事情,假如产品族中需要增加一个新的产品,则几乎所有的工厂类都需要进行修改。所以使用抽象工厂模式时,对产品等级结构的划分是非常重要的。