前言

在面向对象程序设计中,工厂通常是一个用来创建其他对象的对象。工厂是构造方法的抽象,用来实现不同的分配方案。

工厂方法模式

工厂方法模式(英语:Factory method pattern)是一种实现了“工厂”概念的面向对象设计模式。就像其他创建型模式一样,它也是处理在不指定对象具体类型的情况下创建对象的问题。工厂方法模式的实质是“定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。工厂方法让类的实例化推迟到子类中进行。”

根据定义可以知道,工厂方法模式的实质是定义一个创建对象的接口,但让实现这个接口的类来决定实例化哪个类。类的实例在子类中进行。
首先创建一个创建对象的接口ProgrammeFactory

public interface ProgrammeFactory {Video getVideo();
}

只有一个方法用于获取各类语言的教学视频,再定义两个子类去实现它

// 获取Java语言的教学视频
public class JavaProgrammeFactory implements ProgrammeFactory {@Overridepublic Video getVideo() {System.out.println("获取Java视频教程");return new JavaVideo();}}// 获取Python语言的教学视频
public class PythonProgrammeFactory implements ProgrammeFactory {@Overridepublic Video getVideo() {System.out.println("获取Python视频教程");return new PythonVideo();}}

测试代码

public class FactoryMethodDemo {public static void main(String[] args) {ProgrammeFactory factory = new JavaProgrammeFactory();factory.getVideo();factory = new PythonProgrammeFactory();factory.getVideo();}
}

工厂方法模式适用场景:

  • 创建对象需要大量重复代码
  • 客户端(应用层)不依赖与产品类实例如何被创建、实现等细节
  • 一个类通过其子类来指定创建哪个对象

工厂方法模式优点:

  • 用户只需关心所需要产品对应的工厂,无需关心创建的细节
  • 加入新产品符合开闭原则,提供可扩展性

工厂方法模式缺点:

  • 类的个数容易过多,增加复杂性
  • 增加了系统的抽象性和理解难度

完整代码:工厂方法模式

抽象工厂模式

抽象工厂模式(英语:Abstract factory pattern)是一种软件开发设计模式。抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来。在正常使用中,客户端程序需要创建抽象工厂的具体实现,然后使用抽象工厂作为接口来创建这一主题的具体对象。客户端程序不需要知道(或关心)它从这些内部的工厂方法中获得对象的具体类型,因为客户端程序仅使用这些对象的通用接口。抽象工厂模式将一组对象的实现细节与他们的一般使用分离开来。

抽象工厂模式主要用来解决产品族的问题。比如工厂模式中提到的两种语言,不止有教学视频,还有文章等,如此一来,就可以分为:Java视频、Java文章、Python视频、Python文章四种产品。其中Java视频和Java文章属于同一产品族,Python视频和Python文章属于同一产品族。而Java视频和Python视频属于不同产品族的同一产品等级,Java文章和Python文章也是如此。这时便要用到抽象工厂模式

首先创建一个创建对象的接口ProgrammeFactory

public interface ProgrammaFactory {Video getVideo();Article getArticle();
}

有两个方法用于获取视频教程和文章教程(同一产品族),再定义两个子类去实现它

// 获取Java产品族的工厂
public class JavaProgrammaFactory implements ProgrammaFactory {public Video getVideo() {System.out.println("获取Java视频教程");return new JavaVideo();}public Article getArticle() {System.out.println("获取Java文章教程");return new JavaArticle();}
}// 获取Python产品族的工厂
public class PythonProgrammaFactory implements ProgrammaFactory {public Video getVideo() {System.out.println("获取Python视频教程");return new PythonVideo();}public Article getArticle() {System.out.println("获取Python文章教程");return new PythonArticle();}
}

测试代码

public class FactoryMethodDemo {public static void main(String[] args) {ProgrammaFactory factory = new JavaProgrammaFactory();factory.getVideo();factory.getArticle();factory = new PythonProgrammaFactory();factory.getVideo();factory.getArticle();}}

抽象工厂模式适用场景:

  • 客户端(应用层)不依赖产品类实例如何被创建、实现等细节
  • 强调一系列相关的产品对象(属于同一产品族)一起使用创建对象需要大量重复的代码
  • 提供一个产品类的库,所有产品以同样的接口出现,从而使客户端不依赖与具体实现

抽象工厂模式优点:

  • 具体产品在应用层代码隔离,无需关心创建细节
  • 将一个系列的产品族统一到一起创建

抽象工厂模式缺点:

  • 规定了所有可能被创建的产品集合,产品族中扩展新的产品等级困难,需要修改抽象工厂的接口
  • 增加了系统的抽象性和理解难度

完整代码:抽象工厂模式

总结

工厂方法模式和抽象工厂模式都是用来创建对象的设计模式。调用者无需知道对象被创建的具体过程,对调用者来说工厂类就是一个黑盒。

工厂方法模式中,每个工厂只能生产一类产品,而抽象工厂模式中,每个工厂可以生产一系列产品。

设计模式:工厂方式模式、抽象工厂模式相关推荐

  1. JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂——理解“开放封闭”

    JavaScript 设计模式核⼼原理与应⽤实践 之 创建型:工厂模式·抽象工厂--理解"开放封闭" 一个不简单的简单工厂引发的命案 在实际的业务中,我们往往面对的复杂度并非数个类 ...

  2. Head First设计模式读书笔记四 简单工厂 工厂模式 抽象工厂模式

    本文示例代码材料源自Head First设计模式 以前整理自己整理的链接: 工厂模式 https://blog.csdn.net/u011109881/article/details/56541580 ...

  3. 设计模式---(3)抽象工厂模式

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

  4. Java设计模式—工厂方法模式抽象工厂模式

    工厂方法模式与抽象工厂模式都是设计模式中重要而且常见的模式.       工厂方法模式:定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法使一个类的实例化延迟到其子类. 通用类图如下: 在 ...

  5. 【Java设计模式】简单学抽象工厂模式——你好,微信还是支付宝

    目录 说明 实现方式 自问自答 其他链接 说明 五大创建型模式之一,其他还有单例模式.原型模式.建造者模式.工厂模式. 抽象工厂模式(Abstract Factory Pattern):定义了一个in ...

  6. 设计模式(二)抽象工厂模式

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

  7. 设计模式:工厂方法与抽象工厂模式

    说明:这篇blog写的很好,有助于理解工厂方法与抽象工厂模式的联系与区别. 原文链接:http://blog.csdn.net/yzxz/article/details/4601152 抽象工厂模式与 ...

  8. 研磨23种大话设计模式------简单工厂模式 + 工厂方法模式 + 抽象工厂模式

    大家好,我是一位在java学习圈中不愿意透露姓名并苟且偷生的小学员,如果文章有错误之处,还望海涵,欢迎多多指正 如果你从本文 get 到有用的干货知识,请帮忙点个赞呗,据说点赞的都拿到了offer 简 ...

  9. 【设计模式】Unity3D 简单工厂、工厂(方法)、抽象工厂模式

    创建型模式-工厂三兄弟 提示:个人学习总结,如有错误,敬请指正 文章目录 创建型模式---工厂三兄弟 一.简单工厂模式 1.简单工厂模式是什么? 2.UML图 3.实现方式 二.工厂(方法)模式 1. ...

  10. 2.5万字详解23种设计模式—创建型模式(简单工厂、工厂方法、抽象工厂、单例-多线程安全详解、建造者、原型)的详细解读、UML类图

    本文简述了各大设计模式,并通过UML和代码详细说明.本文大约共 2.5W 字,建议收藏.下方是本文的目录: 一.设计模式的认识 二.设计模式的分类 根据其目的 根据范围 三.设计模式的优点 四.设计模 ...

最新文章

  1. 3年前的一个小项目经验,分享给菜鸟兄弟们(公文收发小软件:小技能 DeleteMark)...
  2. 递归函数练习——累乘
  3. 程序员编码能力差,竟是睡眠不足惹的祸?!
  4. OpenCV探索之路——图像形态学处理(膨胀、腐蚀、开运算、闭运算)
  5. python求两组同学的平均成绩_Python学习心得2:求平均值
  6. phpstorm2017破解方法
  7. 项目管理甘特图模板_甘特图简易制作流程
  8. mcc、mbuild和mex命令详解
  9. 贪吃蛇html网页小游戏,JavaScript贪吃蛇,网页在线版贪食蛇游戏
  10. python 答题插件_大话西游答题器 Python版本
  11. outlook移动ost邮箱数据到D盘
  12. 给定三角形边长,求三角形面积
  13. 小程序直播带货系统优势—直播带货的技巧
  14. 植物神经紊乱会不会导致失眠
  15. 在一种特殊情况下损坏了wav音频文件,修复的方法
  16. Chu序列的特性及仿真说明(2020_11_3更新)
  17. OpenCV中的图像处理 —— 图像阈值+图像平滑+形态转换
  18. 京东开源项目之列表解决方案Drip-Table
  19. MySQL长途售票系统_基于SSH的长途汽车票务售票系统的设计(Struts2,MySQL)(含录像)...
  20. 余世维成功经理人视频

热门文章

  1. 如何用HTML5制作iPhone App
  2. 制作水晶头,网线的排线顺序应怎样排
  3. linux有线网卡驱动
  4. 超强整理,非科班小硕的进击之路
  5. 解压版mysql下载安装
  6. windows安装nacos
  7. “流血”的物流,“补血”的德邦
  8. 网优谷带你盘一盘重构IT基础架构的“七种武器”!
  9. python 黑屏检测
  10. php网站模板制作教程视频教程,CCTVPHP网页制作教程网joomla模板制作视频教程