抽象工厂模式C++实现

1定义

为创建一组相关或者依赖的对象提供一个接口,且无需指定他们的具体类

2类图

3实现

class AbstractProduct

{

protected:

  AbstractProduct(){}

public:

  void SharedThing()

    {  //实现产品的共性功能}

  //每个产品都有的功能,具体实现有差异

  virtual SomeThing() = 0;

  virtual ~AbstractProduct()=0;

};

//两种不同的产品(抽象层)

class AbstactProductA:public AbstractProduct

{};

class AbstactProductB:public AbstractProduct

{};

//产品纵向分化,eg对于已经确定的中国人,日本人,又要区分男女了。

class ProductA1:public AbstractProductA

{};

class ProductA2:public AbstractProductA

{};

class ProductB1:public AbstractProductB

{};

class ProductB2:public AbstractProductB

{};

class AbstractCreator

{

protected:

  AbstractCreator(){}

public:
  virtual AbstractProductA* CreatProductA()=0;
  virtual AbstractProductB* CreatProductB()=0;

  virtual ~AbstractCreator()=0;

};

class Creator1:public AbstractCreator

{

  AbstractProductA* CreatProductA()

  {

    return new ProductA1();

  }
  AbstractProductB* CreatProductB()

  {
    return new ProductB1();

  }

};

class Creator2:public AbstractCreator

{

  AbstractProductA* CreatProductA()

  {

    return new ProductA2();

  }
  AbstractProductB* CreatProductB()

  {
    return new ProductB2();

  }

};

注:看到类图,你可能会很困惑,这个和工厂模式的类图是没区别的。那么如何区分这两个模式呢。

细读定义

工厂模式:为一类产品定义其实例化操作

抽象工厂:为一组相关或者依赖的产品定义实例化。

一类表明在产品方向上,他们是横向,同级存在的。eg学院的各专业

一组说明则是产品方向上,是纵向分化的,新增的分化。eg专业的具体分班:1,2,3

讨论<借鉴《设计模式C++实现》>
AbstractFactory 模式和 Factory 模式的区别是初学(使用)设计模式时候的一个容易引
起困惑的地方。 实际上, AbstractFactory 模式是为创建一组( 有多类) 相关或依赖的对象提
供创建接口, 而 Factory 模式正如我在相应的文档中分析的是为一类对象提供创建接口或延
迟对象的创建到子类中实现。并且可以看到, AbstractFactory 模式通常都是使用 Factory 模
式实现( ConcreteFactory1)

4应用

①优点:封装性;产品族内的约束为非公开状态:eg 产品分化的比例(专业内各班级人数平衡)这个问题对于客户是透明的,非公开的

②缺点:产品族扩展困难,每增加一个产品C,就必须在抽象类AbstractCreator中增加对应的方法,同时在每一个具体的工厂方法中加入对应代码,这违反了开闭原则。

5使用场景

一个对象族(或一组没有任何关系的对象)都有相同的约束,则可以使用抽象工厂模式。

6注意事项

提示:对于抽象工厂模式的缺点

扩展性差说的是产品族扩展困难而不是产品等级。

或者说横向容易,纵向难。

或者说产品末端结点扩展容易(1,2,3),中间难(ABC)

或者说抽象层的扩展难,具象层扩展容易(依赖倒置原则)

7个人理解

抽象工厂模式和工厂模式其实主要是以提供未知类型实例化接口为主。

而当工厂模式中的产品层需要进一步划分时(区分性别),那就将上层工厂抽象化,而后实例化终端工厂。

所以,对于工厂模式和抽象工厂模式的区分理解重点在于理解“产品族”“产品等级”两个概念。

设计模式--抽象工厂模式C++实现的更多相关文章

  1. 设计模式——抽象工厂模式及java实现

    设计模式--抽象工厂模式及java实现 设计模式在大型软件工程中很重要,软件工程中采用了优秀的设计模式有利于代码维护,方便日后更改和添加功能. 设计模式有很多,而且也随着时间在不断增多,其中最著名的是 ...

  2. 5. 星际争霸之php设计模式--抽象工厂模式

    题记==============================================================================本php设计模式专辑来源于博客(jymo ...

  3. JAVA设计模式--抽象工厂模式

    抽象工厂设计模式 1.系统中有多个产品族,而系统一次只可能消费其中一族产品2.同属于同一个产品族的产品以其使用.来看看抽象工厂模式的各个角色(和工厂方法的如出一辙):抽象工厂角色: 这是工厂方法模式的 ...

  4. 深入浅出设计模式——抽象工厂模式(Abstract Factory)

    模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...

  5. 24种设计模式--抽象工厂模式【Abstract Factory Pattern】

    女娲造人,人是造出来了,世界是热闹了,可是低头一看,都是清一色的类型,缺少关爱.仇恨.喜怒哀乐等情绪,人类的生命太平淡了,女娲一想,猛然一拍脑袋,忘记给人类定义性别了,那怎么办?抹掉重来,然后就把人类 ...

  6. C++设计模式——抽象工厂模式

    问题描述 之前讲到了C++设计模式——工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理:由于工厂方法模式创建的对象都是继承于Produ ...

  7. 设计模式 | 抽象工厂模式(abstract factory)

    定义: 提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类. 结构:(书中图,侵删) 这个图相对来说有一点点复杂,其实就是在工厂方法模式的基础上做了一些扩展,工厂方法模式只用于生成一种 ...

  8. 设计模式 — 抽象工厂模式(Abstract Factory)

    工厂模式已经分析了简单工厂模式和工厂方法模式.并且了解了工厂方法模式去简单工厂模式的延伸,工厂方法模式如果不把工厂类抽象的话,就是简单工厂模式.由前面两个工厂模式可以猜测出抽象工厂模式应该是这两种工厂 ...

  9. C#设计模式--抽象工厂模式(创建型模式)

    一.抽象工厂模式: 在工厂模式中具体的产品和具体的工厂是一一对应的,一个工厂只能生产一种产品,结构单一,例如小米公司刚开始是只生产小米手机,但是伴随着公司的发展,他们需要生产不同型号的手机,也会生产路 ...

随机推荐

  1. select 自动选择 检查下拉列表

    下面我们来看一下selenium webdriver是如何来处理select下拉框的,以Apple注册页面为例. https://appleid.apple.com/cgi-bin/WebObject ...

  2. django连接mongodb mongoengine

    优点 MongoEngine (http://mongoengine.org)1. 提供了和 Django 原生 ORM 几乎一样的一切,功能已经相当强大;2. 用起来比 Django 原生 ORM ...

  3. python中变量的交换

    a=4 b=5 #第一种 c=0 c=a a=b b=c print('a=%d,b=%d'%(a,b)) #第二种 a=a+b b=a-b a=a-b print('a=%d,b=%d'%(a,b) ...

  4. EasyUI合并行

    扩展一下 EasyUI   下面湿扩展EasyUI 合并行的方法 $.extend($.fn.datagrid.methods, { autoMergeCells: function (jq, fie ...

  5. JVM内存分配原理

    堆栈常量池等内存分配原理详解 存储的方式: 寄存器 栈(stack) 堆(heap) 静态域 常量池 非RAM存储 JAVA寄存器 最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.  ...

  6. 19. Remove Nth Node From End of List(移除倒数第N的结点, 快慢指针)

    Given a linked list, remove the nth node from the end of list and return its head. For example, Give ...

  7. vue package.json 解析

    vue package.json 中可以看到这个包的来源位置 在repository对象中的url中可以看到     所以当你要封装自己包的时候就可以改变这个地址去加载这个包(把你封装的包发到某个gi ...

  8. JavaScript 事件处理详解

    事件绑定与解绑: el.onEventName = function (){} document.getElementById("dom").onclick = function( ...

  9. 应用libjpeg提取jpeg质量因子

    http://blog.csdn.net/lzhq28/article/details/7775222 版权声明:本文为博主原创文章,未经博主允许不得转载. data = new BYTE [cinf ...

  10. 20144303 《Java程序设计》第八周学习总结

    20144303 <Java程序设计>第八周学习总结 教材学习内容总结 第十五章 1.日志API简介: java.util.logging包提供了日志功能相关类与接口,不必额外配置日志组件 ...