1. 意图
    提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。
2. 别名
    Kit
3. 动机
        假设我们要开发一款游戏,当然为了吸引更多的人玩,游戏难度不能太大 (让大家都没有信心了,估计游戏也就没有前途了),但是也不能太简单 (没有挑战性也不符合玩家的心理)。于是我们就可以采用这样一种处理策略:为游戏设立等级,初级、中级、高级甚至有BT 级。假设也是过关的游戏,每个关卡都有一些怪物 (monster)守着,玩家要把这些怪物干掉才可以过关。作为开发者,我们就不得不创建怪物的类,然后初级怪物、中级怪物等都继承自怪物类(当然不同种类的则需要另创建类,但是模式相同)。在每个关卡,我们都要创建怪物的实例,例如初级就创建初级怪物(有很多种类)、中级创建中级怪物等。可以想象在这个系统中,将会有成千上万的怪物实例要创建,问题是还要保证创建的时候不会出错:初级不能创建 BT  级的怪物(玩家就郁闷了,玩家一郁闷,游戏也就挂挂了),反之也不可以。
     AbstractFactory 模式就是用来解决这类问题的:要创建一组相关或者相互依赖的对象。

4.适用性
      ①一个系统要独立于它的产品的创建、组合和表示时。

②一个系统要由多个产品系列中的一个来配置时。
      ③当你要强调一系列相关的产品对象的设计以便进行联合使用时。
      ④当你提供一个产品类库,而只想显示它们的接口而不是实现时。

5.参与者
      ①AbstractFactory(WidgetFactory):声明一个创建抽象产品对象的操作接口。

②Concreteactory(MotifWidgetFactory,PMWidgetFactory):实现创建具体产品对象的操作。
      ③AbstractProduct(Windows,ScrollBar):为一类产品对象声明一个接口。
      ④ConcreteProduct(MotifWindow,MotifScrollBar):定义一个将被相应的具体工厂创建的产品对象;实现AbstractProduct接口。
      ⑤Client:仅使用由AbstractFactory和AbstractProduct类声明的接口。

6.协作
      ①通常在运行时刻创建一个ConcreteFactroy类的实例。这一具体的工厂创建具有特定实现的产品对象。为创建不同的产品对象,客户应使用不同的具体工厂。       ②AbstractFactory将产品对象的创建延迟到它的ConcreteFactory子类。 7.优缺点
       ①它分离了具体的类AbstractFactory模式帮助你控制一个应用创建的对象的类。因为一个工厂封装创建产品对象的责任和过程,它将客户与类的实现分离。客户通过它们的抽象接口操纵实例。产品的类名也在具体工厂的实现中被分离;它们不出现在客户代码中。
      ②它使得易于交换产品系列 一个具体工厂类在一个应用中仅出现一次—即在它初始化的时候。这使得改变一个应用的具体工厂变得很容易。它只需改变具体的工厂即可使用不同的产品配置,这是因为一个抽象工厂创建了一个完整的产品系列,所以整个产品系列会立刻改变。在我们的用户界面的例子中,我们仅需转换到相应的工厂对象并重新创建接口,就可实现从Motif窗口组件转换为Presentation Manager窗口组件。       ③它有利于产品的一致性 当一个系列中的产品对象被设计成一起工作时,一个应用一次只能使用同一个系列中的对象,这一点很重要。而AbstractFactory很容易实现这一点。       ④难以支持新种类的产品 难以扩展抽象工厂以生产新种类的产品。这是因为AbstractFactory接口确定了可以被创建的产品集合。 支持新种类的产品就需要扩展该工厂接口,这将涉及AbstractFactory类及其所有子类的改变。我们会在实现一节讨论这个问题的一个解决办法。

8.讨论
      AbstractFactory 模式和 Factory 模式的区别是初学(使用)设计模式时候的一个容易引起困惑的地方。实际上,AbstractFactory 模式是为创建一组 (有多类)相关或依赖的对象提供创建接口,而Factory 模式正如我在相应的文档中分析的是为一类对象提供创建接口或延迟对象的创建到子类中实现。并且可以看到,AbstractFactory 模式通常都是使用 Factory 模式实现(ConcreteFactory1 )。
#include<iostream>
class AbstractProductA{
public:
virtual ~ AbstractProductA(){}
protected:
AbstractProductA(){}
};
class AbstractProductB{
public:
virtual ~ AbstractProductB(){}
protected:
AbstractProductB(){}
};
class ProductA1:public AbstractProductA{
public:
ProductA1(){std::cout<< "ProductA1..."<<std::endl;}
};
class ProductA2:public AbstractProductA{
public:
ProductA2(){std::cout<< "ProductA2..."<<std::endl;}
};
class ProductB1:public AbstractProductB{
public:
ProductB1(){std::cout<< "ProductB1..."<<std::endl;}
};
class ProductB2:public AbstractProductB{
public:
ProductB2(){std::cout<< "ProductB2..."<<std::endl;}
};
class AbstractFactory{
public:
virtual ~AbstractFactory(){}
virtual AbstractProductA* CreateProductA()=;
virtual AbstractProductB* CreateProductB()=;
protected:
AbstractFactory(){}
};
class ConcreteFactory1:public AbstractFactory{
public:
AbstractProductA* CreateProductA(){ return new ProductA1();}
AbstractProductB* CreateProductB(){ return new ProductB1();}
};
class ConcreteFactory2:public AbstractFactory{
public:
AbstractProductA* CreateProductA(){ return new ProductA2();}
AbstractProductB* CreateProductB(){ return new ProductB2();}
};
int main(){
AbstractFactory * cf1 = new ConcreteFactory1();
cf1->CreateProductA();
cf1->CreateProductB();
AbstractFactory * cf2 = new ConcreteFactory2();
cf2->CreateProductA();
cf2->CreateProductB();
}

对象创建型模式------Abstract Factory(抽象工厂)的更多相关文章

  1. 设计模式(3)-对象创建型模式-Abstract Factory模式

    1.对象创建型模式 1.3           Abstract Factory模式 1.3.1 需求 在下面情况能够使用Abstract Factory模式: •  一个系统要独立于它的产品的创建. ...

  2. 设计模式可复用面向对象软件设计基础之对象创建型模式—ABSTRACT FACTORY( 抽象工厂)

    意图 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 适用性 在以下情况可以使用 Abstract Factory模式 • 一个系统要独立于它的产品的创建.组合和表示时. • 一 ...

  3. 创建型模式——Abstract Factory

    1.意图 提供一个创建一系列相关或相互依赖的接口,而无需指定它们具体的类. 2.结构 3.参与者 AbstractFactory声明一个创建抽象产品对象的操作接口 ConcreteFactory实现创 ...

  4. 设计模式02: Abstract Factory 抽象工厂(创建型模式)

    Abstract Factory 抽象工厂(创建型模式) 常见的对象创建方法:    //创建一个Road对象    Road road=new Road();    new的问题:    -实现依赖 ...

  5. 设计模式(4)-对象创建型模式-Prototype模式

    1.对象创建型模式 1.4          Protoype模式 1.4.1需求 通过拷贝原形对象创建新的对象. 1.4.2结构 •P r o t o t y p e(Gr a p h i c) - ...

  6. 设计模式(一): abstract factory抽象工厂模式 -- 创建型模式

    1.定义 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类. 2.适用场景 1.一个系统要独立于它的产品创建.组合和表示. 2.一个系统要由多个产品系列中的一个来配置. 3.当你要 ...

  7. Abstract Factory抽象工厂模式

    抽象工厂模式是是用一个超级工厂去创建其他工厂,简单点说就是工厂的父类,属于创建型模式. 目标:提供一个创建一组对象的方法,而无需指定它们具体的类(同工厂方法). 使用场景:系统的产品有多于一个的产品族 ...

  8. 【创建型】Abstract Factory模式 & Factory Method模式

    本文主要介绍简单工厂模式与抽象工厂模式.以下如有叙述不当之处,欢迎批评指正,欢迎交流探讨. 一:简单工厂模式 在23种设计模式中,简单工厂模式其实是不在列的,但理解该模式对于抽象工厂模式的思想理解是有 ...

  9. 一天一个设计模式——Abstract Factory抽象工厂模式

    一.模式说明 前面学习了工厂方法(Factory Method)模式.在工厂方法模式中,在工厂方法模式中,父类决定如何生成实例,但并不决定所要生成的具体类,具体的处理交由子类来处理.这里学习的抽象工厂 ...

随机推荐

  1. TCP恋爱史:三次握手和四次分手

    TCP协议非常重要,这里把它的连接和释放整理一下. 首先是三次握手: 1.  客户端发起,像服务器发送的报文SYN=1,ACK=0,然后选择了一个初始序号:seq=x. SYN是干什么用的? 在链接的 ...

  2. JavaAPI之Runtime类以及bat文件开启应用程序

    package OtherToolsClass; import java.io.IOException; public class RuntimeDemo { /** * @param args */ ...

  3. Android实例-解决启动黑屏问题(XE8+小米2)

    结果: 1.在启动时马上出现图片界面,但在出现程序界面前会有黑屏,大约有0.2秒左右. 实现: 1.建立2个文件:loading.png和styles.xml: ①其中loading.png是启动时替 ...

  4. [OC Foundation框架 - 7] NSArray的创建与遍历

    NSArray是不可变的,不能先创建再添加元素 NSArray可以放入任何OC对象,但不能放入基本数据类型.结构体.枚举等非OC对象 不能存储nil   A.常用方法1 创建 返回用量 是否含有某元素 ...

  5. Stage3D学习笔记(四):正交矩阵

    我们上一章节显示图片的时候,会发现我们制定的顶点在Stage3D中其实是存在一个区间的: x轴(从左到右):[-1.0-1.0] y轴(从下到上):[-1.0-1.0] z轴(从近到远):[0-1.0 ...

  6. android视频播放心得体会

    android视频播放主要是两种方式1.系统封装好的videoplayer,有前进.后退.暂停/播放.拉动最基本的功能,够一般使用,操作办法也很简单,如果需要自定义程度高就需要用到第二种方法:Surf ...

  7. Xcode8 创建NSManageObject subclass方法

    更新iOS8之后发现coredata也做了一些改变,创建本地的时候一脸懵逼,最后发现: 喜极而泣不能自已,(-.-!)

  8. Notes(一)

    Numerous experimental measurements in spatially complex systems have revealed anomalous diffusion in ...

  9. Java split用法

    Java split用法 java.lang.string.split split 方法  将一个字符串分割为子字符串,然后将结果作为字符串数组返回. stringObj.split([separat ...

  10. jquery ajax 报交请求返回 HTTP 400 错误

    提交请求的AJAX代码如下: 点击(此处)折叠或打开 $.ajax({ url: "${ctx}/selfhelp/userAttributeAnalysis/userAttributeLi ...