定义
提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
![](http://hi.csdn.net/attachment/201107/28/0_131183788253nK.gif)
理解
1. AbstractFactory
是抽象工厂类,声明创建产品族的接口。具体工厂创建具体的产品族(Product Family
),可以创建出分属于不同产品等级的一个产品族中的所有对象。ConcreteFactory1
和ConcreteFactory2
分别生产2
个不同产品族。
举例:手机工厂生产的产品族中,产品有Linux
系统的手机和Windows
系统的手机。PC
工厂生产的产品族中,产品有Linux
系统的PC
和Windows
系统的PC
。
2. AbstractProductA
和AbstractProductB
是产品基类。它们的派生类是同产品等级结构(产品类型)的具的体产品。
举例:Linux
的具体产品类型包括Linux
手机版和Linux PC
版,Windows
的具体产品类型包括Windows
手机版和Windows PC
版。
产品族和产品等级的关系:
![](http://hi.csdn.net/attachment/201107/28/0_13118379058U7c.gif)
从上图可以看出,4
个具体工厂,每个产品族有3
个不同类型的产品,可以生产具体产品4*3=12
中具体产品。而对于工厂方法模式,生产12
中产品,需要有12
个工厂。
3.
调用者(Client
)只能看到抽象层次接口。
要点
1.
抽象工厂应用场景:
一个系统要独立于它的产品的创建、组合和表示时。
一个系统要由多个产品系列中的一个来配置时。
当你要强调一系列相关的产品对象的设计以便进行联合使用时。
当你提供一个产品类库,而只想显示它们的接口而不是实现时。
2.
新增产品复杂
。抽象工厂增加产品组件时,需要更改所有工厂的接口。如增加产品ProductC
,则工厂基类和具体工厂需要增加接口CreateProductC
。
3.
抽象工厂模式与工厂方法模式的区别。
a.
重点不同。工厂方法模式强调的是不同的创建者根据自身需求去生产不同的具体产品,重点是生产具体产品;而抽象工厂模式则定位为“在不指定实体类别的前提下,提供了一个可以创建一系列相关或互相依赖之组件的接口”,重点是创建相关组件。
b.
抽象工厂提供了的“相关组件”可以看成是具体的产品(如ProductA1
),抽象工厂模式的“相关组件”可由工厂模式实现。ConcreteFactory1.CreateProuductA()
生产的具体产品,可以用工厂方法模式实现,即每一个产品用一个工厂方法实现。
c.
工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。
d.
抽象工厂不能直接创建产品,只能创建工厂,即抽象工厂创建的产品是工厂。虽然它也定义了创建产品的方法,但需要创建出来的具体的工厂实现,即抽象工厂创建出的工厂创建产品。
e.
工厂方法采用的是类继承机制(生成一个子类,重写该工厂方法,在该方法中生产一个对象);而抽象工厂采用的是对象组合机制,专门定义“工厂”对象来负责对象的创建。对象组合的方式就是把“工厂”对象作为参数传递。
应用
抽象工厂模式可应用:支持多种数据库的数据库接口访问层;界面设计各种风格界面等。
源码中通过PC
工厂和手机工厂和预装的操作系统产品来举例实现模式。
源码
#include
<iostream>
#include
<string>
using
namespace std;
/
产品
class
CLinux
{
public
:
virtual ~CLinux() {};
//
产品使用公共接口
virtual void Start() = 0;
};
class
CLinuxMobile : public CLinux
{
public
:
CLinuxMobile()
{
cout << "create linux mobile." << endl;
}
virtual ~CLinuxMobile() {};
virtual void Start()
{
cout << "linux mobile start." << endl;
};
};
class
CLinuxPC : public CLinux
{
public
:
CLinuxPC()
{
cout << "create linux PC." << endl;
}
virtual ~CLinuxPC() {};
virtual void Start()
{
cout << "linux PC start." << endl;
};
};
class
CWindows
{
public
:
virtual ~CWindows() {};
//
产品使用公共接口
virtual void Start() = 0;
};
class
CWindowsMobile : public CWindows
{
public
:
CWindowsMobile()
{
cout << "create windows mobile." << endl;
}
virtual ~CWindowsMobile() {};
virtual void Start()
{
cout << "windows mobile start." << endl;
};
};
class
CWindowsPC : public CWindows
{
public
:
CWindowsPC()
{
cout << "create windows PC." << endl;
}
virtual ~CWindowsPC() {};
virtual void Start()
{
cout << "windows PC start." << endl;
};
};
工厂
class
CFactory
{
public
:
virtual ~CFactory(){};
//
产品族有个产品组件
virtual CLinux* CreateLinux() = 0;
virtual CWindows* CreateWindows() = 0;
};
class
CMobileFactory : public CFactory
{
public
:
CMobileFactory()
{
cout << "create mobile factory." << endl;
}
virtual ~CMobileFactory(){};
virtual CLinux* CreateLinux()
{
return new CLinuxMobile;
};
virtual CWindows* CreateWindows()
{
return new CWindowsMobile;
};
};
class
CPCFactory : public CFactory
{
public
:
CPCFactory()
{
cout << "create PC factory." << endl;
}
virtual ~CPCFactory(){};
virtual CLinux* CreateLinux()
{
return new CLinuxPC;
};
virtual CWindows* CreateWindows()
{
return new CWindowsPC;
};
};
void
Test(CFactory* pFactory)
{
CLinux* pLinux = NULL;
CWindows* pWindows = NULL;
pLinux = pFactory->CreateLinux();
pWindows = pFactory->CreateWindows();
pLinux->Start();
pWindows->Start();
delete pWindows;
delete pLinux;
};
int
main()
{
CFactory* pFactory = NULL;
//
手机工厂。生产手机产品族,种类有
Linux
和
Windows
pFactory = new CMobileFactory;
Test(pFactory);
delete pFactory;
cout << endl;
//PC
工厂。生产
PC
产品族,种类有
Linux
和
Windows
pFactory= new CPCFactory;
Test(pFactory);
delete pFactory;
system("pause");
return 0;
}
输出:
create mobile factory.
create linux mobile.
create windows mobile.
linux mobile start.
windows mobile start.
create PC factory.
create linux PC.
create windows PC.
linux PC start.
windows PC start.