抽象工厂模式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. 《闪存问题之PROGRAM DISTURB》总结

    来自 http://www.ssdfans.com/?p=1814 SSD之所以需要BCH或LDPC等ECC纠错算法,是因为闪存中的数据会在神不知鬼不觉的情况下发生比特翻转. 导致比特翻转的原因很多, ...

  2. UVA10341:Solve It(二分+math.h库)

    题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=68990#problem/E 题目要求:p*e-x+ q*sin(x) + r*co ...

  3. Spring框架第四篇之基于注解的DI注入

    一.说明 与@Component注解功能相同,但意义不同的注解还有三个: 1)@Repository:注解在Dao实现类上 2)@Service:注解在Service实现类上 3)@Controlle ...

  4. Part01、sqlalchemy 使用

    一.ORM         连表               一对多               1.创建表,主动指定外键约束.               2.操作.                 ...

  5. android 带listview对话框

    package com.example.dialog2; import android.os.Bundle;import android.app.Activity;import android.app ...

  6. PKU 2513 Colored Sticks(并查集+Trie树+欧拉路径(回路))

    题目大意: 给定一些木棒,木棒两端都涂上颜色,求是否能将木棒首尾相接,连成一条直线,要求不同木棒相连接的一端必须是同颜色的. 解题思路: 可以用图论中欧拉路的知识来解这道题,首先可以把木棒两端看成节点 ...

  7. 中线,基线,垂直居中vertical-align:middle的一些理解

    基线:小写字母xxxxx的下边缘线就是我们的css基线:一般的行内元素都是vertical-align: baseline;默认设置: x-height:就是指小写字母xxxx的高度,下边缘线到上边缘 ...

  8. 理解android分辨率限定符 layout-sw360dp

    首先,我们来看看单位dp是怎么一回事,dp是一种单位,使用它,你可以在高.低分辨率上获得一样的空间表现,也就是说,它是像素无关的. dp计算公式:160*pix/ppi(pix是你要计算的高度或者宽度 ...

  9. C++与C混编

    C++与C混编 本案例通过实现一个简单的UDP服务器来说明C++与C的混合编程问题 C代码 通过C代码来对UDP服务器的创建,监听进行封装 udp.c文件 #include <sys/types ...

  10. java字符串分割的小练习

    最近看到一个网友的一个小问题,有关字符串分割的,思考了一下,后面给出代码:碰到一个java字符串判断结尾的问题,发现与c\c++以"\0"判断字符串结尾不同的是,java中字符串是 ...