抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
适用性:
- 一个系统要独立于它的产品的创建、组合和表示时
- 一个系统要有多个产品系列中的一个来配置时
- 当你要强调一系列相关的产品对象的设计以便进行联合开发使用时
- 当你提供一个产品类库,而只想显示它们的接口而不是实现时
结构:
对比工厂方法,抽象工厂内部实现了工厂方法;工厂方法用以创建一类对象,抽象工厂用以创建一系列相关的对象。举个例子,假设我们的任务是制造一部汽车,汽车有很多的零部件组成;抽象工厂就是用来创建这部汽车,它有很多生产线,负责制造不同型号的汽车;不同生产线需要不同的零部件(委托零部件制造商制造);一系列的各种零部件组装成不同型号的汽车。
效果:
1. 它分离了具体的类 AbstractFactory模式帮助你控制一个应用创建的对象的类。以制造汽车为例,汽车的抽象工厂封装了制造整部汽车对象的责任和过程,它将客户与汽车的各种零件的制造和组装分离。客户通过汽车抽象工厂接口操作汽车实例。
2. 它使得易于交换产品系列 切换生产线,生产另外型号的汽车
3. 它有利于产品的一致性一系列零部件被组装成一部汽车,该型号汽车只能使用该系列零部件;你给Q7换一个X6的发动机是不可行的。
4. 难以支持新种类的产品难以扩展抽象工厂以生产新种类的产品,因为抽象工厂接口确定了可以被创建的产品集合。支持新种类的产品就需要扩展该工厂接口,这涉及到抽象工厂类及其所有子类的改变。你想在BMW生产线上生产Audi,就得有BMW汽车制造厂(抽象工厂)厂长下令修改制造流程,这将会影响该厂所有的汽车生产线。
在使用过程中,经常将工厂以单件模式实现,各种零部件委托不同的制造商(通常都是唯一的)
示例:
以Audi汽车制造为背景:该公司有两汽车加工厂,分别组装A6和A4;生产线用到的零部件全部外包给世界各地的零部件供应商;生产线需要零部件时,各地供应商会送货上门
- #include<iostream>
- #include<string>
-
-
//
CarComponent - classCarComponent
- {
- protected:
-
CarComponent(conststd::string& addr, conststd::string& attr, conststd::string& qly): -
address(addr), -
attribute(attr), -
quality(qly){} - public:
-
voidgetInfo() -
{ -
std::cout<< "Component: "<< attribute<< std::endl;; -
std::cout<< "Quality: "<< quality<< std::endl; -
std::cout<< "Address of producing: "<< address<< std::endl; -
} - private:
-
std::stringaddress; -
std::stringattribute; -
std::stringquality; - };
-
-
//
CarBody - class CarBody : publicCarComponent
- {
- protected:
-
CarBody(conststd::string& addr, conststd::string& qly): -
CarComponent(addr,"CarBody", qly){} - };
-
-
//
CarDecorate - class CarDecorate : publicCarComponent
- {
- protected:
-
CarDecorate(conststd::string& addr, conststd::string& qly): -
CarComponent(addr,"CarDecorate", qly){} - };
-
-
//
A6Body - class A6Body : publicCarBody
- {
- public:
-
A6Body(): -
CarBody("NewYork","Best"){} - };
-
-
//
A4Body - class A4Body : publicCarBody
- {
- public:
-
A4Body(): -
CarBody("London","Normal"){} - };
-
-
//
A6Decorate - class A6Decorate : publicCarDecorate
- {
- public:
-
A6Decorate(): -
CarDecorate("Munich","Best"){} - };
-
-
//
A4Decorate - class A4Decorate : publicCarDecorate
- {
- public:
-
A4Decorate(): -
CarDecorate("Seoul","Normal"){} - };
-
-
//
Car - classCar
- {
- public:
-
Car(CarBody*cb,CarDecorate* cd): -
body(cb), -
decorate(cd){} -
voidgetInfo(){ -
std::cout<< "--------Info of the Car---------" <<std::endl; -
body->getInfo(); -
std::cout<< "--------"<< std::endl; -
decorate->getInfo(); -
} - private:
-
CarBody*body; -
CarDecorate*decorate; - };
-
-
//
Manufacturer - classCarBodyManufacturer
- {
- public:
-
virtualCarBody* createCarBody() = 0; - };
-
- template<classProduct>
- class CarBodyManufacturerT: public CarBodyManufacturer
- {
- public:
-
virtualCarBody* createCarBody(); - };
-
- template<classProduct>
- CarBody*CarBodyManufacturerT<Product>::createCarBody()
- {
-
return newProduct; - }
-
-
class
CarDecorateManufacturer - {
- public:
-
virtualCarDecorate* createCarDecorate() = 0; - };
-
- template<classProduct>
-
classCarDecorateManufacturerT
: publicCarDecorateManufacturer - {
- public:
-
virtualCarDecorate* createCarDecorate(); - };
-
- template<classProduct>
-
CarDecorate*CarDecorateManufacturerT
<Product>::createCarDecorate() - {
-
return newProduct; - }
-
-
//
CarFactory - classCarFactory
- {
- public:
-
virtual Car*CreateCar(){ -
return newCar(CreateCarBody(),CreateCarDecorate()); - }
- protected:
-
virtualCarBody* CreateCarBody() = 0; -
virtualCarDecorate* CreateCarDecorate() = 0; - };
-
-
class
A6Factory: publicCarFactory - {
- protected: