抽象工厂模式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. 使用jQuery为文本框、单选框、多选框、下拉框、下拉多选框设值及返回值的处理

    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  2. What does Quick Sort look like in Python?

    Let's talk about something funny at first. Have you ever implemented the Quick Sort algorithm all by ...

  3. Django-RestFrameWork之分页 视图 路由 渲染器

    目录 一.分页 二.视图 三.路由 四.渲染器 一.分页 试问如果当数据量特别大的时候,你是怎么解决分页的? 方式a.记录当前访问页数的数据id 方式b.最多显示120页等 方式c.只显示上一页,下一 ...

  4. php 通过http user-agent判断是否为手机浏览器

    <?php/*** 判断是否是通过手机访问* @return bool 是否是移动设备    */public function isMobile() {  //判断手机发送的客户端标志  if ...

  5. Codeforces Round #416 (Div. 2) D. Vladik and Favorite Game

    地址:http://codeforces.com/contest/811/problem/D 题目: D. Vladik and Favorite Game time limit per test 2 ...

  6. The 15th UESTC Programming Contest Preliminary C - C0ins cdoj1554

    地址:http://acm.uestc.edu.cn/#/problem/show/1554 题目: C0ins Time Limit: 3000/1000MS (Java/Others)     M ...

  7. docker基本用法和命令

    1.安装docker 检查有没有curl which curl 如果没有用以下命令可安装:sudo apt-get install curl 通过官方提供的脚本安装最新docker curl -sSL ...

  8. 【c++ primer, 5e】函数声明 & 分离式编译

    p186~p188: 函数声明1.函数只能定义一次,但是可以声明多次. 2.函数的接口:返回类型 + 函数名 + 形参类型 3.为什么要在头文件中进行函数声明???在源文件中定义?暂时理解到,这么做可 ...

  9. 【Error】安装程序无法打开注册表项 UNKNOWN\Components\...

    在安装程序的时候出现错误信息: 解决方法: 依次点击开始,所有程序,附件,右键单击命令提示符,选择以管理员身份运行.运行secedit /configure /cfg %windir%\inf\def ...

  10. Object的各种方法

    Object的一些知识点总结 1.hasOwnProperty obj.hasOwnProperty(prop) 参数 prop: 要检测的属性字符串名称或者Symbol 返回值 用来判断一个对象是否 ...