现在的位置: 首页 > 综合 > 正文

【设计模式】Abstract Factory(抽象工厂)

2013年01月27日 ⁄ 综合 ⁄ 共 3236字 ⁄ 字号 评论关闭
抽象工厂,提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。


适用性:
  • 一个系统要独立于它的产品的创建、组合和表示时
  • 一个系统要有多个产品系列中的一个来配置时
  • 当你要强调一系列相关的产品对象的设计以便进行联合开发使用时
  • 当你提供一个产品类库,而只想显示它们的接口而不是实现时
结构:

对比工厂方法,抽象工厂内部实现了工厂方法;工厂方法用以创建一类对象,抽象工厂用以创建一系列相关的对象。举个例子,假设我们的任务是制造一部汽车,汽车有很多的零部件组成;抽象工厂就是用来创建这部汽车,它有很多生产线,负责制造不同型号的汽车;不同生产线需要不同的零部件(委托零部件制造商制造);一系列的各种零部件组装成不同型号的汽车。
效果:
1. 它分离了具体的类 AbstractFactory模式帮助你控制一个应用创建的对象的类。以制造汽车为例,汽车的抽象工厂封装了制造整部汽车对象的责任和过程,它将客户与汽车的各种零件的制造和组装分离。客户通过汽车抽象工厂接口操作汽车实例。
2. 它使得易于交换产品系列 切换生产线,生产另外型号的汽车
3. 它有利于产品的一致性一系列零部件被组装成一部汽车,该型号汽车只能使用该系列零部件;你给Q7换一个X6的发动机是不可行的。
4. 难以支持新种类的产品难以扩展抽象工厂以生产新种类的产品,因为抽象工厂接口确定了可以被创建的产品集合。支持新种类的产品就需要扩展该工厂接口,这涉及到抽象工厂类及其所有子类的改变。你想在BMW生产线上生产Audi,就得有BMW汽车制造厂(抽象工厂)厂长下令修改制造流程,这将会影响该厂所有的汽车生产线。
在使用过程中,经常将工厂以单件模式实现,各种零部件委托不同的制造商(通常都是唯一的)
示例:
以Audi汽车制造为背景:该公司有两汽车加工厂,分别组装A6和A4;生产线用到的零部件全部外包给世界各地的零部件供应商;生产线需要零部件时,各地供应商会送货上门
【设计模式】Abstract <wbr>Factory(抽象工厂)
  • #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:

抱歉!评论已关闭.