目录

1 学习目标

2 什么是抽象工厂模式?

3 抽象工厂模式作用

4 工厂模式参与者

5 代码实现


1 学习目标

通过本篇文章的学习,你应当掌握以下知识:
1 知道什么是抽象工厂模式?
2 掌握抽象工厂模式的作用以及什么时候需要使用抽象工厂模式
3 掌握使用JS实现抽象工厂模式的代码编写。

2 什么是抽象工厂模式?

抽象工厂模式提供了一种封装一组具有相同主题的单个工厂而无需指定其具体类的方法。即工厂的工厂;一个将单个但相关/从属工厂分组在一起的工厂,但未指定其具体类别。

一个抽象工厂创建了由一个共同主题相关的对象。在面向对象的编程中,工厂是一个创建其他对象的对象。一个抽象工厂已经抽象出了一个主题,这个主题被新创建的对象所共享。

你可能会奇怪为什么要把构造对象的责任交给别人,而不是直接用new关键字调用构造函数。原因是,构造函数对整个创建过程的控制是有限的,有时你需要把控制权交给一个拥有更广泛知识的工厂。

这包括创建过程中涉及对象缓存、对象共享或重用、复杂逻辑、或维护对象和类型计数的应用程序、以及与不同资源或设备交互的对象等场景。如果您的应用程序需要对对象创建过程进行更多控制,请考虑使用抽象工厂模式。

3 抽象工厂模式作用

当存在相互关联的依赖关系且涉及非简单创建逻辑时,建议使用抽象工厂模式。

通常在以下情况下考虑使用抽象工厂模式:

  1. 一个系统应该独立于其产品的创建,组成和表示方式

  2. 系统应配置有多个产品系列之一

  3. 一个相关产品对象系列旨在一起使用,因此您需要强制执行此约束

  4. 您想要提供产品的类库,并且只想显示它们的接口,而不是它们的实现

  5. 从概念上讲,依赖项的生存期短于消费者的生存期。

  6. 您需要一个运行时值来构建特定的依赖关系

  7. 您想决定在运行时从系列中调用哪种产品。

  8. 您需要提供一个或多个仅在运行时才知道的参数,然后才能解决依赖关系。

  9. 当您需要产品之间的一致性时

  10. 在将新产品或产品系列添加到程序时,您不想更改现有代码。

4 工厂模式参与者

抽象工厂模式参与者主要有:

AbstractFactory:

1 声明产品的接口

2 在JavaScript中不使用

ConcreteFactory:

1 工厂对象

2 create()方法返回新产品

产品 :

1 工厂创建的产品实例

AbstractProduct:

1 在JavaScript中没有使用

2 声明要创建的产品的接口

5 代码实现

因为JavaScript不支持基于类的继承,因此,在下面的JavaScript代码中未使用图中所示的抽象类。抽象类和接口在派生类中的作用是强制使用一致的接口。因此在JavaScript中,我们必须确保每个“ Concrete”对象与其他对象具有相同的接口定义(即属性和方法),以确保自身的一致性。

在下面的代码示例中,我们创建了两个具体的工厂:EmployeeFactory和VendorFactory。EmployeeFactory用于创建Employee的实例,VendorFactory用于创建Vendor的实例。两种产品都可以看做是人员类型(具有相同的接口),所以客户可以将它们看做是相同。在run函数中,我们通过不同的工厂创建了两个员工和两个供应商,它们存储在同一个数组中。每个员工或供应商都要说出他们的名字和类型。日志函数用来收集和显示结果。

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>JS抽象工厂模式:微信公众号AlbertYang</title></head><body></body><script>//员工类function Employee(name) {this.name = name;this.say = function() {log.add("我是员工:" + name);};}//员工工厂function EmployeeFactory() {this.create = function(name) {return new Employee(name);};}//供应商类function Vendor(name) {this.name = name;this.say = function() {log.add("我是供应商:" + name);};}//供应商工厂function VendorFactory() {this.create = function(name) {return new Vendor(name);};}// 日志函数var log = (function() {var log = "";return {add: function(msg) {log += msg + "\n";},show: function() {console.info("%c%s", "color: red; background: #b4b3b3; font-size: 20px", log);log = "";}}})();function run() {var persons = [];var employeeFactory = new EmployeeFactory();var vendorFactory = new VendorFactory();persons.push(employeeFactory.create("张三"));persons.push(employeeFactory.create("李四"));persons.push(vendorFactory.create("王麻子"));persons.push(vendorFactory.create("赵六"));for (var i = 0, len = persons.length; i < len; i++) {persons[i].say();}log.show();}run();</script>
</html>

今天的学习就到这里,你可以使用今天学习的技巧来改善一下你曾经的代码,如果想继续提高,欢迎关注我,每天学习进步一点点,就是领先的开始。如果觉得本文对你有帮助的话,欢迎点赞,评论,转发,感谢!!!

设计模式(6)[JS版]-JavaScript如何实现抽象工厂模式?相关推荐

  1. CSharp设计模式读书笔记(3):抽象工厂模式(学习难度:★★★★☆,使用频率:★★★★★)...

    抽象工厂模式(Abstract Factory Pattern):提供一个创建一系列相关或相互依赖对象的接口,而无须指定它们具体的类.抽象工厂模式又称为Kit模式. 模式角色和结构图: 抽象工厂是指一 ...

  2. 设计模式系列一创建型之(抽象工厂模式)

    1.抽象工厂简介 在软件系统中,经常面临着"一系列相互依赖的对象"的创建工作:同时由于需求的变化,往往存在着更多系列对象的创建工作. 如何应对这种变化? 如何绕过常规的对象的创建方 ...

  3. 设计模式(9)[JS版]-JavaScript设计模式之如何实现桥接模式???

    目录 1 什么是桥接模式 2 参与者 3 实例讲解 4 总结 1 什么是桥接模式 Bridge模式允许两个组件,即客户端和服务一起工作,每个组件都有自己的接口.Bridge是一种高级架构模式,它的主要 ...

  4. 设计模式(7)[JS版]-JavaScript设计模式之原型模式如何实现???

    目录 1.什么是原型模式 2 参与者 3 实例讲解 4 使用 Object.create实现原型模式 4.1 Object.create()的用法 4.2 用 Object.create实现继承 4. ...

  5. 设计模式(10)[JS版]-JavaScript如何实现组合模式???

    目录 1 什么是组合模式 2 主要参与者 3 代码实现 4 应用实例 4.1 表单验证 4.1 图片阅读器 5 总结 1 什么是组合模式 组合模式允许创建具有属性的对象,这些对象是原始项目或对象集合. ...

  6. 【JavaScript设计模式张容铭】抽象工厂模式深度剖析——关于继承与constructor属性的深度理解

    写在前面 最近阅读了张容铭的<JavaScript设计模式>一书,阅读到抽象工厂模式一节时对书上的代码产生了疑问,但同时在解决疑问的过程中,对继承又产生了新的理解. 我仔细查阅了很多文章, ...

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

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

  8. Javascript设计模式(三)-- 抽象工厂模式

    抽象工厂模式:通过对类的工厂抽象使其业务用于对产品类簇的创建,而不负责创建某一类产品的实例. 抽象类 //测试抽象类,使用其实例方法时会抛出错误 var test = function(){}; te ...

  9. JavaScript 设计模式学习第九篇- 抽象工厂模式

    工厂模式 (Factory Pattern),根据输入的不同返回不同类的实例,一般用来创建同一类对象.工厂方式的主要思想是将对象的创建与对象的实现分离. 抽象工厂 (Abstract Factory) ...

最新文章

  1. 预处理_不锈钢锻件预处理的必要性
  2. Python学习之旅 —— 基础篇(二)数据类型、运算、while循环
  3. vsc系统是什么意思_电脑蓝屏是什么意思?蓝屏就一定要重装系统吗?你可不要弄错了...
  4. publiccms按照指定显示的日期格式,格式化日期的写法
  5. 网页loading效果 可以通过js控制旋转速度
  6. c#自定义控件做漂亮的列表
  7. 我为什么用 SQLite 和 FMDB 而不用 Core Data
  8. php 常用时间处理函数,PHP date函数常用时间处理方法_PHP
  9. ubuntu sudo password 无法输入解决方法
  10. 从Android support到Androidx
  11. CentOS7下安装H2o的经历(How did I install the h2o in centos7?)
  12. 2017计算机知识竞赛题,2017年《西游记》知识竞赛试题100题附答案.doc
  13. Android OpenGL ES视频渲染(一)GLSurfaceView
  14. python中range函数是什么意思_python中range什么意思
  15. 软件测试丨工具在接口测试中发挥什么样的作用?
  16. 石墨笔记,熊掌记和 Effie 哪个更适合 SMZDM 开箱评论者?
  17. 游戏开发者放心!Cocos引擎未感染XcodeGhost
  18. Day_04 传智健康项目-预约管理-套餐管理
  19. 如果太阳突然爆炸 地球会发生什么?| 1分钟了解广义相对论
  20. 分享一款开箱即用的qss暗黑主题

热门文章

  1. 做系统的关键操作的日志功能
  2. 教育机构怎么利用线上活动进行招生推广?
  3. Discuz!附件下载次数不更新的问题原因和解决办法
  4. python iloc函数_python pandas Series.iloc用法及代码示例
  5. python 整除及余数_python除法余数
  6. 0的阶乘是多少?0的算法,工龄有哪些计算法?
  7. 1到n的阶乘之和公式c语言,n的阶乘(1到n的阶乘之和公式)
  8. 智能网联精准公交解决方案白皮书发布,希迪智驾与腾讯开启战略合作(附下载)...
  9. python字符串去重 保留第一次出现的_python 列表和字符串
  10. C51---震动传感器控制继电器开关