工厂模式已经分析了简单工厂模式和工厂方法模式。并且了解了工厂方法模式去简单工厂模式的延伸,工厂方法模式如果不把工厂类抽象的话,就是简单工厂模式。由前面两个工厂模式可以猜测出抽象工厂模式应该是这两种工厂模式的另外一个变化。先来看一下它的定义。

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

  先简单介绍一下定义的意思,就是需要创建一个接口,这个接口的作用就是用来创建一个以上的对象的,并且这些对象是相互依赖的,还不需要指定它们具体实现的类,应该是别创建对象的类。为了更好的理解,就用急速PDF阅读器切换皮肤为例子来介绍一下。

  切换皮肤有多个地方是同时变动风格的。为了例子的简洁易懂,就那下面那个地方为例

  • 背景
  • 软件头部

  很容易看出来,皮肤修改这二个是相互关联的,相互依赖的。不然出来的效果就是似是而非了。

  代码示例

给出切换皮肤需要配置的三个部分的类

//系统背景接口(产品A)
public interface SystemBackground {public String controlStyle();
}//系统头部(产品B)
public interface SystemHead {public String controlStyleB();
}//系统简洁大气背景风格 (产品A1)
public class SystemBackgroundImplA implements SystemBackground {@Overridepublic String controlStyle() {// TODO Auto-generated method stubreturn "简洁大气的背景风格";}}//系统中国风背景(产品A2)
public class SystemBackgoundImplB implements SystemBackground{@Overridepublic String controlStyle() {// TODO Auto-generated method stubreturn "中国风的背景风格";}}//系统简洁大气头部(产品B1)
public class SystemHeadImplA implements SystemHead {@Overridepublic String controlStyleB() {// TODO Auto-generated method stubreturn "简洁大气的系统头部";}}//系统中国风头部(产品B2)
public class SystemHeadImplB implements SystemHead {@Overridepublic String controlStyleB() {// TODO Auto-generated method stubreturn "中国风的系统头部";}}

工厂类

//工厂接口
public interface SkinFactory {public void createBackgroundSkin();public void createHeadSkin();
}//简洁大气皮肤工厂类
public class SkinFactoryJjdq implements SkinFactory {@Overridepublic void createBackgroundSkin() {// TODO Auto-generated method stubSystemBackground sbg = new SystemBackgroundImplA();System.out.println("切换了"+sbg.controlStyle());}@Overridepublic void createHeadSkin() {// TODO Auto-generated method stubSystemHead sh = new SystemHeadImplA();System.out.println("切换了"+sh.controlStyleB());}}//中国风皮肤工厂类
public class SkinFactoryZgf implements SkinFactory {@Overridepublic void createBackgroundSkin() {SystemBackground sbg = new SystemBackgoundImplB();System.out.println("切换了"+sbg.controlStyle());}@Overridepublic void createHeadSkin() {// TODO Auto-generated method stubSystemHead sh = new SystemHeadImplB();System.out.println("切换了"+sh.controlStyleB());}}

客户端调用

public class Client {public static void main(String[] args) {SkinFactory sf = new SkinFactoryJjdq();//简洁大气System.out.println("--------开始切换【简洁大气】皮肤-----------");sf.createHeadSkin();sf.createBackgroundSkin();System.out.println("*******切换【简洁大气】皮肤结束");//中国风System.out.println("\n --------开始切换【中国风】皮肤-----------");sf = new SkinFactoryZgf();sf.createHeadSkin();sf.createBackgroundSkin();System.out.println("++++++++切换【中国风】皮肤结束");}
}

分析此设计模式

  这个例子就是抽象工厂模式的所要解决的问题。把这个例子结构展示出来,可以更好的理解抽象工厂。

  通过结构图看出来,工厂类有两个方法来创建产品类,并且这两个方法创建的对象是相互关联的。抽象工厂模式重点就在创建相互关联的对象。还拿例子来说,可以看出来工厂类有两个工厂方法。就是创建两个对象。但是不是随意创建的。他们是相互关联的,如果工厂类中一个创建的是简洁大气的头部皮肤,另外一个是中国风的背景。那出来的皮肤肯定就不是一个成功的产品了。所以他们一定是相互关联的。如果理解了工厂方法模式,那么对于抽象工厂模式来说,只要理解创建相互关联的对象这部分。就基本理解了抽象工厂模式要解决问题的本质。

  如果产品族横向扩展(对于这个例子增加新的皮肤),那么添加新的具体工厂实现工厂就扣即可;纵向扩展(对于本例子来说,就是修改皮肤不仅是系统头部和背景,还有另外的依赖部分,比如滑动杆样式),这就需要修改工厂类了。

适应场景

  1. 一个产品要独立于它的创建组合和表示时。
  2. 一个系统需要由多个产品系列中的一个来配置时,并且是由多个相互依赖的部分组合成一个产品的。
  3. 当你提供一个产品类库,只是想显示它们的接口而不是实现时。

三个工厂模式的区别

  三个工厂模式是相互关联的,简单工厂是工厂模式中的最简单的一些表达。他的任务就是把需要创建的对象和调用地方解耦。简单工厂类充当桥梁作用,没有考虑其他更多的问题。但是他有弊端,就是不能灵活扩展,只要想扩展,就需要修改工厂类。

  为了解决这个问题,就发展了工厂方法模式。把工厂类用抽象类表示,实现具体的产品就用继承抽象工厂类的具体工厂来负责,这样就解决了简单工厂里面的扩展问题。

  业务场景纷繁复杂,需要创建的对象也可能是复杂的,为了完成一定功能,需要创建相互关联的多个类。于是,在工厂方法模式基础上,让工厂类实现多个工厂方法。他们创建的对象相互关联共同完成特定功能。这就变成了抽象工厂模式。

小结

  至此,工厂模式系统已经介绍完毕,他们都属于创建者模式。简单工厂模式和工厂方法模式使用的场景基本没有什么区别,只是当业务复杂,考虑扩展时候。就舍弃简单工厂而选用工厂方法模式。个人认为很系统应该也是重构发展的。一个场景可能开始用的简单工厂模式,但是随着系统不断发展,为了更灵活扩展,就修改成工厂方法模式。抽象工厂类使用场景看似很清晰,使用也是在系统不断扩展使用场景渐渐清晰的。工厂模式到这里了,如果以后发现没有理解到部分,再进行补充进来

转载于:https://www.cnblogs.com/pengweiqiang/p/10726446.html

设计模式之(四)抽象工厂模式(Abstract Factory)相关推荐

  1. 【设计模式】抽象工厂模式 Abstract Factory Pattern

    简单工厂模式是一个工厂类根据工厂方法的参数创建不出不同的产品, 工厂方法模式是每一个产品都有一个一一对应的工厂负责创建该产品.那么今天要讲的抽象工厂模式是一个工厂能够产生关联的一系列产品.抽象工厂模式 ...

  2. 设计模式(20):创建型-抽象工厂模式(Abstract Factory)

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  3. 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern)

    原文:乐在其中设计模式(C#) - 抽象工厂模式(Abstract Factory Pattern) [索引页] [源码下载] 乐在其中设计模式(C#) - 抽象工厂模式(Abstract Facto ...

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

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

  5. 设计模式 - 抽象工厂模式(abstract factory pattern) 详解

    抽象工厂模式(abstract factory pattern) 详解 本文地址: http://blog.csdn.net/caroline_wendy/article/details/270916 ...

  6. 抽象工厂模式 Abstract Factory Pattern

    源地址 抽象工厂模式 抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂.该超级工厂又称为其他工厂的工厂.这种类型的设计模式属于创建型模式,它提供了一种创建 ...

  7. 抽象工厂模式-Abstract Factory Pattern

    抽象工厂模式-Abstract Factory Pattern 抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.抽 ...

  8. 设计模式之抽象工厂模式(Abstract Factory)摘录

    面向对象系统的分析和设计实际上追求的就是两点:高内聚(Cohesion)和低耦合(Coupling). 23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.Fa ...

  9. Net设计模式之抽象工厂模式(Abstract Factory Pattern)(1)

    一.抽象工厂模式简介(Bref Introduction) 抽象工厂模式(Abstract Factory Pattern),提供一个创建一系列相关或者相互依赖对象的接口,而无需制定他们的具体类.优点 ...

  10. 设计模式之抽象工厂模式---abstract factory

    模式的介绍 模式的定义 Provide an interface for creating families of related or dependent objects without speci ...

最新文章

  1. 力扣1002.查找常用字符
  2. Html.ActionLink 几种重载方式说明及例子
  3. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输
  4. CCF NOI1010 邮寄包裹
  5. linux下调试core的命令
  6. 十九、“文捷笔妙活如水,气定神闲稳若山。”(2021.6.7)
  7. 01_NumPy介绍,什么是NumPy,Python应用、(NumPy、SciPy、Matplotlib相关网址)--来自菜鸟和NumPy中文网
  8. Java 14的新功能
  9. gdc服务器故障输入信号超出范围,H1Z1信号输入超出范围 | 手游网游页游攻略大全...
  10. C ++ 内存 | C/C++的动态内存管理_1
  11. opencv 亮度增强 二
  12. [Tyvj 模拟赛] 运
  13. 猴子都能懂的数据库范式详解
  14. 使用dex2jar反编译apk
  15. python-opencv 帧差法目标检测
  16. @submit.prevent作用
  17. Android App网络通信中通过runOnUiThread快速操纵界面以及利用线程池Executor调度异步任务实战(附源码 简单易懂)
  18. 【9018:1458】征兵
  19. 编写微信聊天机器人3《聊天精灵WeChatGenius》:使用Xposed来hook微信,找到微信进程。
  20. 8.12 纪中集训 Day12

热门文章

  1. MongoDB数据查询
  2. Ext Designer Preview生成代码在html上显示步骤
  3. ASP.NET几种安全验证方法(一)
  4. python变量名区分大小写_python变量名要不要区分大小写
  5. 吴恩达深度学习 —— 3.7 为什么需要非线性激活函数
  6. leetcode - 646. 最长数对链
  7. 深度学习篇-Keras(初级)
  8. heavy hitter是什么意思?
  9. 外参矩阵(旋转矩阵+平移向量)以及外方位元素的关系
  10. OpenCV--solvePnp