抽象工厂模式

    要创建一组相关或者相互依赖的对象

作用:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。

UML类图

抽象基类:

1)AbstractProductA、AbstractProductB:分别代表两种不同类型的产品,由具体的产品派生类对其实现

2)AbstractFactory:抽象工厂类,提供创建两种产品的接口CreateProductA和CreateProductB,由派生的各个具体工厂类对其实现

说明:

AbstractFactory模式关键就是将这一组对象的创建封装到一个用于创建对象的类(ConcreteFactory)中

Abstract Factory模式和Factory最大的差别就是抽象工厂创建的是一系列相关的对象。其创建的实现其实采用的就是Factory模式的方法,对于某种实现,由一个派生出来的抽象工厂实现,对另一种实现,由另一个派生出来的抽象工厂实现。

  抽象工厂需要特别注意的地方就是区分不同类型的产品和这些产品的不同实现。显而易见的,如果有n种产品同时有m中不同的实现,那么根据乘法原理可知有n*m个Factory模式的使用

抽象工厂模式与工厂模式的区别

  AbstractFactory模式是为创建一组(有多类)相关或依赖的对象提供创建接口,而Factory模式是为一类对象提供创建接口或延迟对象的创建到子类中的实现。并且可以看到,AbstractFactory模式通常都是使用Factory模式实现(ConcreteFactory1)。

   工厂方法模式: 一个抽象产品类,可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类只能创建一个具体产品类的实例。抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。 区别: 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

代码实现:

class AbstractProduct
{
protected:
  AbstractProduct(){} public:
  void SharedThing()
  {  
//实现产品的共性功能
}
  virtual SomeThing() = ; //每个产品都有的功能,具体实现有差异
  virtual ~AbstractProduct()=;
}; //两种不同的产品(抽象层) 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 AbstractFactory
{
protected:
  AbstractFactory(){}
public:
  virtual AbstractProductA* CreatProductA()=;
  virtual AbstractProductB* CreatProductB()=;   virtual ~AbstractCreator()=;
}; class ConcreteAbstractFactory1:public AbstractFactory
{
  AbstractProductA* CreatProductA()
  {
    return new ProductA1();
  }
  AbstractProductB* CreatProductB()
  {
    return new ProductB1();
  }
}; ConcreteAbstractFactory2:public AbstractFactory
{
  AbstractProductA* CreatProductA()
  {
    return new ProductA2();
  }
  AbstractProductB* CreatProductB()
  {
    return new ProductB2();
  } };

应用

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

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

使用场景

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

注意事项

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

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

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

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

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

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++实现

    抽象工厂模式C++实现 1定义 为创建一组相关或者依赖的对象提供一个接口,且无需指定他们的具体类 2类图 3实现 class AbstractProduct { protected: Abstract ...

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

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

随机推荐

  1. 推荐5个漂亮的网站html源码

    给大家推荐几个很漂亮的html网站源码模板,下面就简单列几个,更多的自己可以去看 1.大屏背景摄影工作室作品案例网页模板 [效果预览及下载] 2.粉色响应式IT科技服务器机房企业模板 [效果预览及下载 ...

  2. [转]unload dynamic library needs two dlclose() calls?

    src: http://stackoverflow.com/questions/8793099/unload-dynamic-library-needs-two-dlclose-calls Quest ...

  3. springmvc国际化 基于请求的国际化配置

    springmvc国际化 基于请求的国际化配置 基于请求的国际化配置是指,在当前请求内,国际化配置生效,否则自动以浏览器为主. 项目结构图: 说明:properties文件中为国际化资源文件.格式相关 ...

  4. Json反序列化

    迟来的Json反序列化   源码发布 搞了一个下午,终于搞定改了这个号称中国的github...以后源码直接在这里发布了(英文实在太烂了) https://code.csdn.net/jy023050 ...

  5. asp.net内部原理3

    asp.net内部原理(三) 第三个版本 (最详细的版本) 前言: 今天继续吧这个系列补齐,这几天公司的项目比较忙,回到家已经非常的累了,所以也没顾得上天天来这里分享一些东西和大家一起探讨,但是今天晚 ...

  6. 三.redis 排序

    本篇文章介绍下redis排序命令.redis支持对list,set和sorted set元素的排序.排序命令是sort 完整的命令格式如下: SORT key [BY pattern] [LIMIT ...

  7. WINDOWS下安装PHP7出现PHP-CGI无法启动

    事情经过:下载PHP 7.0 然后运行,发现php-cgi一直挂掉.启动不起来.我直接到文件夹下启动PHP-CGI 启动, 失败,报错提示:缺失vcruntime140.dll.当时心中暗暗一笑,当年 ...

  8. CNN for Visual Recognition (assignment1_Q1)

    参考:http://cs231n.github.io/assignment1/ Q1: k-Nearest Neighbor classifier (30 points) import numpy a ...

  9. 一步一步深入spring(7)-- 整合spring和JDBC的环境

    1.配置数据源 (1).添加支持数据源的jar包commons-dbcp.jar .commons-pool.jar 当然也要添加其他的spring用到的jar以及这里用到的数据库mysql的jar ...

  10. C#实现eval

    C#实现eval 进行四则运算(有码)   在JavaScript中实现四则运算很简单,只需要调用eval函数就行了,但是不知道什么原因万能的.NET却没有封装这个函数~ 在这里为大家封装了一个C#版 ...