js设计模式——工厂模式

132 阅读3分钟

该系列文章用作我读掘金小册《JavaScript 设计模式核⼼原理与应⽤实践》的学习总结笔记,仅供参考~

什么是设计模式?设计模式的核心是什么?

设计模式就是历史里所有程序员解决问题方法的合集,相当于一件件工具,针对特定场合,都有特定的工具能够轻松应付。

核心:开放封闭原则,对修改封闭,对扩展开放。什么意思?就是将代码中一成不变的、所谓的基类,抽离出来,将需要频繁迭代更新的,对外暴露扩展的接口,达到解耦的目的。

工厂模式

顾名思义,一个工厂,工厂的作用就是用于生产东西嘛,我们付钱(传参),工厂生产(生成结果)。

简单工厂模式

处理一个类,且在一个类里做扩展

抽象工厂模式

处理多个类

两种工厂模式的相同点和区别

它们的共同点,在于都尝试去分离一个系统中变与不变的部分。它们的不同在于场景的复杂度。在简单工厂的使用场景里,处理的对象是类,并且是一些非常好对付的类——它们的共性容易抽离,同时因为逻辑本身比较简单,故而不苛求代码可扩展性。抽象工厂本质上处理的其实也是类,但是是一帮非常棘手、繁杂的类,这些类中不仅能划分出门派,还能划分出等级,同时存在着千变万化的扩展可能性——这使得我们必须对共性作更特别的处理、使用抽象类去降低扩展的成本,同时需要对类的性质作划分,于是有了这样的四个关键角色:

  • 抽象工厂(抽象类,它不能被用于生成具体实例):  用于声明最终目标产品的共性。在一个系统里,抽象工厂可以有多个(大家可以想象我们的手机厂后来被一个更大的厂收购了,这个厂里除了手机抽象类,还有平板、游戏机抽象类等等),每一个抽象工厂对应的这一类的产品,被称为“产品族”。
  • 具体工厂(用于生成产品族里的一个具体的产品):  继承自抽象工厂、实现了抽象工厂里声明的那些方法,用于创建具体的产品的类。
  • 抽象产品(抽象类,它不能被用于生成具体实例):  上面我们看到,具体工厂里实现的接口,会依赖一些类,这些类对应到各种各样的具体的细粒度产品(比如操作系统、硬件等),这些具体产品类的共性各自抽离,便对应到了各自的抽象产品类。
  • 具体产品(用于生成产品族里的一个具体的产品所依赖的更细粒度的产品):  比如我们上文中具体的一种操作系统、或具体的一种硬件等。