本专栏内容参考自:咕泡学院Tom老师的《Spring5核心原理与30个类手写实战》,仅作个人学习记录使用,如有侵权,联系速删。

  抽象工厂模式是指提供一个创建一系列相关或相互依赖对象的接口,无需指定他们的具体类。客户端(应用层)不依赖于产品实体类如何被创建、如何被实现等细节,强调的是一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码。需要提供一个产品类的库,所有的产品以同样的接口出现,从而使客户端不依赖于具体实现。
  看抽象工厂模式之前,我们要了解两个概念:产品等级结构和产品族。

如上图,一句话解释:一行是一个产品族,一列是一个产品等级(列表)结构,同一族的产品是出自同一个工厂的
通过上图大概能了解一下产品等级结构和产品族,还是以代码举例吧:
第一期简单工厂,第二期工厂方法
学校有了第三期优化:每个课程不仅要提供课程的录播视频,还要提供课堂笔记,甚至还要有源码才能构成一个完整的课程。在产品等级中新增两个产品:IVideo录播视频和INode课堂笔记接口。

public interface IVideo {void record();
}
public interface INote {void edit();
}

然后创建一个抽象工厂类CourseFactory:

/*** 抽象工厂是用户的主入口* 是Spring中应用最广泛的一种设计模式* 易于扩展*/
public interface CourseFactory {INote createNote();IVideo createViedo();
}

接下来,创建Java产品族的Java视频类JavaVideo:

public class JavaVideo implements IVideo{@Overridepublic void record() {System.out.println("录制Java视频");}
}

扩展产品等级Java课堂笔记类JavaNote:

public class JavaNote implements INote{@Overridepublic void edit() {System.out.println("编写Java笔记");}
}

创建Java产品族的工厂JavaCourseFactory:

public class JavaCourseFactory implements CourseFactory{@Overridepublic INote createNote() {return new JavaNote();}@Overridepublic IVideo createViedo() {return new JavaVideo();}
}

然后创建Python产品的Python视频类PythonVideo:

public class PythonVideo implements IVideo{@Overridepublic void record() {System.out.println("录制python视频");}
}

扩展产品等级Python课堂笔记类PythonNote:

public class PythonNote implements INote{@Overridepublic void edit() {System.out.println("编写python笔记");}
}

然后创建Python产品族的具体工厂PythonCourseFactory:

public class PythonCourseFaactory implements CourseFactory{@Overridepublic INote createNote() {return new PythonNote();}@Overridepublic IVideo createViedo() {return new PythonVideo();}
}

来看客户端调用:

public class Main {public static void main(String[] args) {JavaCourseFactory factory = new JavaCourseFactory();factory.createNote().edit();factory.createViedo().record();PythonCourseFaactory factory2 = new PythonCourseFaactory();factory2.createNote().edit();factory2.createViedo().record();}
}

是不是有那么一丝丝感觉了,上面的代码完整的描述了两个产品族Java和python课程,也描述了两个产品恩济视频和笔记。抽象工厂模式完美且清晰的描述了这样一层复杂的关系,但是如果我们再继续扩展产品等级呢,将源码也加入课程,那么我们的代码从抽象工厂到具体工厂全部都要调整,但很显然不符合开闭原则。所以抽象工厂模式也是有缺点的:
(1)规定了所有可能被创建的产品集合,产品族中扩展新的产品困难,需要修改抽象工厂的接口。
(2)增加了系统的抽象性和理解难度。
但在实际应用中,我们千万不能“犯强迫症”甚至有洁癖。实际需求中,产品等级结构升级是一件非常正常的事情。只要不频繁的升级,根据实际情况可以不遵循开闭原则。代码每半年或者一年升级一次有何不可?

Spring常用设计模式--抽象工厂模式相关推荐

  1. 抽象工厂模式_常用设计模式--抽象工厂模式

    抽象工厂模式 定义 提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类. 作用 在工厂方法模式中,我们的具体创建者每次使用都只能创建一个同类型的对象,假如我们现在需要的是多个不同类型的 ...

  2. Java常用设计模式————抽象工厂模式

    简介 每一个具体工厂类只负责创建抽象产品的某一个具体子类的实例. 与工厂方法模式的区别 工厂方法模式针对的是一个产品等级结构,而抽象工厂模式针对的是多个产品等级结构,因此抽象工厂模式在结构上要比工厂方 ...

  3. Spring常用设计模式--简单工厂模式

    本专栏内容参考自:咕泡学院Tom老师的<Spring5核心原理与30个类手写实战>,仅作个人学习记录使用,如有侵权,联系速删. 工厂模式的由来:   在现实生活中我们都知道,原始社会自给自 ...

  4. Android常用设计模式之工厂模式理解

    Android常用设计模式之工厂模式 前言 工厂模式 普通工厂模式 普通工厂模式例子 简单工厂模式总结: 简单工厂模式优缺点: 抽象工厂模式 抽象工厂模式的例子 抽象工厂模式小结 抽象工厂模式优缺点 ...

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

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

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

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

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

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

  8. Unity3D常用设计模式之工厂模式

    Unity3D常用设计模式<工厂模式>   工厂模式(Factory Pattern)是游戏开发中比较常用的设计模式.这种类型的设计模式属于创建型模式,它提供了一种创建对象实例的最佳方式. ...

  9. 设计模式-抽象工厂模式的应用场景及Java中对抽象工厂的应用

    1. 什么是抽象工厂模式 抽象工厂模式提供了一个创建一系列相关或者相互依赖对象的接口,无需指定他们的类 抽象工厂模式(Abstract Factory Pattern)隶属于设计模式中的创建型模式,用 ...

  10. 常用设计模式-抽象工厂

    模式简介 工厂模式主要是为创建对象提供了接口.工厂模式按照<Java与模式>中的提法分为三类: 1. 简单工厂模式(Simple Factory) 2. 工厂方法模式(Factory Me ...

最新文章

  1. HDU2552 三足鼎立 【数学推理】
  2. 拜托,别再问我什么是堆了!
  3. openssl工具的使用以及创建私有CA
  4. 阿里专家晨末:什么是技术一号位?
  5. 【树莓派】Raspbian 中国软件镜像源
  6. 【C语言】数据结构C语言版 实验4 栈与字符串
  7. 设计类超实用的导航网站,一网包含1000+个行业内热门资讯灵感源!
  8. STM8学习笔记---定时器 TIM4功能实现
  9. 微软 Edge bug 导致黑客窃取用户在任意站点的机密信息,颁发2万美元奖金
  10. Qt5_自定义处理Windows消息函数
  11. 解决confuserEx混淆导致类名消失的问题
  12. 无刷电机FOC控制笔记
  13. LSB算法的改进matlab版
  14. 全球知名虚拟服务器,国外十大虚拟主机
  15. net以execl做数据库_基于C#.NET实现Excel数据导入数据库技术
  16. 华硕路由域名访问_使用金万维宽带通云解析实现用友T+异地访问
  17. 【前后端分离登录流程】
  18. GPS设置及原理教程-如何通过修改gps.conf文件来提高搜星速度
  19. JAVA个人博客系统设计与实现 毕业设计开题报告
  20. C语言 数组的指针和指向数组的指针变量-2

热门文章

  1. PHP中MD5函数效率
  2. [matlab数字图像处理3]打开一副低对比度图像,拉伸其图像对比度
  3. idea配置阿里格式化模板+注释模板
  4. NetworkManager 替代工具 wicd
  5. 软件系统安全性测试列表
  6. 什么软件可以测试电脑显示器坏点,怎么检测液晶显示器亮点、暗点、坏点
  7. Spring实战(第4版)第1章 Spring之旅
  8. 嵌入式C语言(入门必看)
  9. stl文件用proe怎么打开_stl格式怎么打开
  10. 《分布式系统架构:技术栈详解与快速进阶》导读