*要学习某个设计模式,首先要了解该设计模式是为了解决一个什么样的问题,
在现实中应用场景是什么,才能达到事半功倍的效果。 --Sepmay*

在添加链接描述上一篇文章中,介绍了工厂方法,对工厂方法的理念,解决的问题,以及现实中的应用都作了讲解。 之前提到的工厂方法是为了解决这样的问题,在软件系统中,经常面临着创建对象的工作,由于需求的不断变化,需要创建的对象的具体类型也会经常产生变化
那么抽象工厂是为了解决什么问题?它与工厂方法有什么联系和区别是什么呢?

问题:在软件系统中,经常面临着需要创建“一系列相互依赖的对象”,同时,由于需求的变化,可能需要创建另一组相互依赖的对象,所以往往存在多系列对象的创建工作。

接下来进入一个案例:
假设一个工厂需要生产三种产品A,B,C,每个产品都要经过三个流程,分别为design(设计),process(加工),assemble(组装),并且每个产品的三个流程都不相同。

根据题意我们得创建三个流程对象,分别为design对象,process对象,assemble对象,每个对象中实现相应的方法,并且根据不同的产品,需要创建相应的流程对象,A得创建属于A的design,process和assemble对象,以此类推所以说三个流程之间是相互依赖的,不能A的design之后进行属于B的process流程,这样与实际情况不符合,明显是错误的。按照工厂模式的方法,大家可以尝试下,写是可以完成的,但是代码重复性也较高,较为繁琐。

抽象工厂的方法,是将有一系列依赖关系的对象抽象成一个类,通过一个类进行管理,避免了错误并且简单利落。接下来看代码:

 class Design{public:virtual void Designing() = 0;virtual ~Design() {}
};class Process {public:virtual void Processing() = 0;virtual ~Process() {}
};
class Assemble {public:virtual void Assembling() = 0;virtual ~Assemble() {}
};class AbstractFactory{public:virtual Design* Creatdesign () = 0;virtual Process* Creatprocess () =0;virtual Assemble* Creatassemble () =0;virtual ~AbstractFactory () {}
};//A
class Adesign : public Design{  virtual void Designing() {cout<<"Designing A..."<<endl;}
};class Aprocess : public Process{virtual void Processing(){cout<<"Processing A..."<<endl;}
};class Aassemble : public Assemble{virtual void Assembling(){cout<<"Assembling A...\n"<<endl;}
};class AFactory : public AbstractFactory{virtual Design* Creatdesign () {    return new Adesign();}virtual Process* Creatprocess () {    return new Aprocess();}virtual Assemble* Creatassemble (){    return new Aassemble();}
};//B
class Bdesign : public Design{  virtual void Designing() {cout<<"Designing B..."<<endl;}
};class Bprocess : public Process{virtual void Processing(){cout<<"Processing B..."<<endl;}
};class Bassemble : public Assemble{virtual void Assembling(){cout<<"Assembling B...\n"<<endl;}
};class BFactory : public AbstractFactory{virtual Design* Creatdesign () {    return new Bdesign();}virtual Process* Creatprocess () {    return new Bprocess();}virtual Assemble* Creatassemble (){    return new Bassemble();}
};//C
class Cdesign : public Design{  virtual void Designing() {cout<<"Designing C..."<<endl;}
};class Cprocess : public Process{virtual void Processing(){cout<<"Processing C..."<<endl;}
};class Cassemble : public Assemble{virtual void Assembling(){cout<<"Assembling C...\n"<<endl;}
};class CFactory : public AbstractFactory{virtual Design* Creatdesign () {    return new Cdesign();}virtual Process* Creatprocess () {    return new Cprocess();}virtual Assemble* Creatassemble (){    return new Cassemble();}
};class Employee{private:AbstractFactory* fac;
public:Employee(AbstractFactory* fac){this->fac = fac;}void Result (){Design* des = fac->Creatdesign();Process* pro = fac->Creatprocess();Assemble* ass = fac->Creatassemble();des->Designing();pro->Processing();ass->Assembling();}
};int main()
{Employee worker1 = Employee(new AFactory());Employee worker2 = Employee(new BFactory());Employee worker3 = Employee(new CFactory());worker1.Result();worker2.Result();worker3.Result();return 0;
}

从上面的程序可以看出,当我们添加一个产品D的工作线非常容易,只需要根据接口再写一个符合D的操作流程即可,所以说拓展起来非常容易。但是可以发现,这种方法对产品的操作方法要求较高,需要它们的流程,操作方法一致,并且再添加更改某个对象会较复杂。
优点是确实解决了一系列依赖对象的创建问题,复用性也较高。

每个设计模式都不可避免的有它使用的场景,有它的缺点和优点,如果期望每个地方都可以更改,那每个设计模式都实现不了,如果每一点都不要求更改,那我们也就用不着设计模式。设计模式重要的是它的可变与不可变的部分,使得可变的部分实现设计的要求,尽可能让更多的部分不变,我觉得这是设计模式的闪光点。

  总结:若没有应对“多系列对象构建”的需求,那么运用简单的工厂方法就行,没有必要使用Abstract Method。“系列对象”指的是一系列下的对象之间相互依赖作用,不同系列的对象不能相互依赖。抽象工厂模式优点主要在于应对“新系列”的需求变动。 缺点是难以应对“新对象”的需求变动。

设计模式-抽象工厂总结相关推荐

  1. 创建设计模式 - 抽象工厂设计模式

    创建设计模式 - 抽象工厂设计模式 欢迎来到java示例中的Abstract Factory Design Pattern.摘要工厂设计模式是创造模式之一.抽象工厂模式几乎类似于工厂模式,除了它更像工 ...

  2. 系统架构技能之设计模式-抽象工厂模式

    一.上篇回顾 上篇我们主要讲述了简单工厂模式和工厂模式.并且分析了每种模式的应用场景和一些优缺点,我们现在来回顾一下: 简单工厂模式:一个工厂负责所有类型对象的创建,不支持无缝的新增新的类型对象的创建 ...

  3. 常见设计模式—抽象工厂模式

    设计模式-抽象工厂模式 1.什么是抽象工厂模式 抽象工厂模式是围绕一个超级工厂创建其它工厂,是工厂方法模式的升级版本,工厂方法模式只生产一个等级的产品,而抽象工厂模式可生产多个等级的产品. 2.角色分 ...

  4. 【JAVA进阶系列】JAVA 设计模式 -- 抽象工厂模式(Abstract Factory)

    [JAVA进阶系列]JAVA 设计模式 -- 抽象工厂模式(Abstract Factory) [1.1]抽象工厂模式简介 抽象工厂者模式的类结构图 AbstractProduct(抽象产品),Abs ...

  5. java设计模式---抽象工厂模式

    工厂模式在项目中是常常用到的,有人说只有大项目才会用到,小项目是体会不出来.其实使用设计模式与项目的大小没有实质性的联系.设计模式是经验的总结而不是衡量项目大小的标准. 以开发项目的DAO层为例,在项 ...

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

    前言 前面有两篇文章分别介绍了简单工厂模式和工厂方法模式,这两种模式都比较常见,今天介绍工厂模式的最后一种,抽象工厂模式. 抽象工厂模式(Abstract Factory Pattern)是所有形态的 ...

  7. python工厂模式 理解_浅谈Python设计模式 - 抽象工厂模式

    声明:本系列文章主要参考<精通Python设计模式>一书,并且参考一些资料,结合自己的一些看法来总结而来. 在上一篇我们对工厂模式中的普通工厂模式有了一定的了解,其实抽象工作就是 表示针对 ...

  8. 05设计模式——抽象工厂模式

    前言:以下总结来自龙哥---左潇龙博客. 总结的很到位,附上博客链接:http://www.cnblogs.com/zuoxiaolong/p/pattern6.html 抽象工厂模式算是工厂相关模式 ...

  9. [设计模式] ------ 抽象工厂模式

    抽象工厂模式 抽象工厂模式,就是对工厂方法模式加以改进而已,其实就是用简单工厂模式的套路创建各个工厂,后面和工厂模式就一模一样了. 其实就是相当于将创建哪个工厂的权利再次放给调用端. 调用端在调用的时 ...

  10. C++设计模式-抽象工厂模式

    目录 基本概念 代码与实例 基本概念 抽象工厂模式(Abstract Factory),提供一个创建一系列相关或相互依赖对象的接口,从而无需指定他们具体的类. 抽象工厂的好处: 1. 易于交换产品系列 ...

最新文章

  1. HDOJ 1874 HDU 1874 畅通工程续 ACM 1874 IN HDU
  2. 使用jQuery.Ajax向ASP.NET MVC控制器Post数据
  3. hough变换是如何检测出直线和圆的
  4. date、sleep和usleep命令
  5. mysql数据库表中的类型_MySQL数据库中表类型MyISAM与InnoDB的区别
  6. 【转】细说.NET中的多线程 (三 使用Task)
  7. cheaklist 人机交互界面_10个人机交互系统及界面的设计方案
  8. MySQL给查询结果添加一表表示行号或名次(1)
  9. jQuery:实现排他
  10. 计算机word求差函数,表格里怎么自动求差/怎样在word2010表格中求差
  11. Incapsula到底是什么
  12. 朱松纯教授:可解释性是人工智能获得人类信任的关键
  13. 安装了多个java 如何切换java版本
  14. AliOS Things
  15. 在js中Date对象用getDay方法get到的是个啥玩意儿?
  16. Python:什么叫自定义模块?
  17. g第十四周,十五周作业
  18. 使用Dash快速构建你的数据可视化前端
  19. android自定义大括弧
  20. 在markdown中控制文字的颜色,背景色,字体大小,字体样式及颜色RGB转换工具链接

热门文章

  1. APPCAN 电子签名设置
  2. 常用的人脸检测识别等数据集百度云下载
  3. Nginx介绍及原理简单分析
  4. 可解释性研究 -LRP-for-LSTM
  5. 视频字幕API接口文档
  6. 马云坦然不懂计算机,来自马云的绝望:三角函数让我彻底失去学数学的信心
  7. 炒菜机器人的弊端_家用炒菜机器人好用吗?都说买了全自动炒菜机后悔了。。...
  8. IDEA2020版本Bpmn文件无Editor属性设置编辑器问题的解决
  9. Neo4j-Graph Database Internals
  10. 移动硬盘加密后在linux中如何使用方法,移动硬盘加密的方法你都知道吗?