原稿:语雀 · 设计模式 · 原目录:JavaScript › 设计模式

参考链接:JS设计模式

单例模式

  • 意义:核心思想是确保一个类只对应一个实例。虽然js是弱类型的语言,但是js也有构造函数和实例。所以这里可以理解为确保多次构造函数时,都返回同一个实例 —— 全局对象是最简单的单例模式
  • 举例:JS 执行中的 global 对象
function A(name){
    // 如果已存在对应的实例
   if(typeof A.instance === 'object'){
       return A.instance
   }
   //否则正常创建实例
   this.name = name

   // 缓存
   A.instance =this
   return this
}

var a1 = new A()
var a2= new A()
console.log(a1 === a2)//true

工厂模式

  • 意义:工厂模式是一种用来创建对象的设计模式。不暴露对象创建的逻辑,而是将逻辑封装在一个函数内,那么这个函数可以成为工厂函数,由它提供创建对象的公共接口
  • 主要解决:主要解决接口选择的问题
  • 何时使用:明确地计划不同条件下创建不同实例时
  • 举例:arrSymbol.iteratorSymbol.iterator 获取到迭代器工厂,执行时获取一个迭代器对象

观察者模式

  • 意义:一个被称作被观察者的对象,维护一组被称为观察者的对象,这些对象依赖于被观察者,被观察者自动将自身的状态的任何变化直接通知给它们
  • 举例:DOM 模型可以视为观察者模式,DOM 元素作为被观察者,事件处理程序作为观察者,当事件发生时,这种变化会被观察者捕获到,做出响应反应。

发布订阅模式

  • 意义:在软件架构中,发布订阅是一种消息范式,消息的发送者(称为发布者)不会将消息直接发送给特定的接收者(称为订阅者)。而是将发布的消息分为不同的类别,无需了解哪些订阅者可能存在。同样的,订阅者可以表达对一个或多个类别的兴趣,只接收感兴趣的消息,无需了解哪些发布者存在
  • 举例:Vue2.x 依赖收集与通知

面向对象特点

抽象

把实现需求的某一类东西,提取出来,用程序代码表示,抽象出来的一般叫做类或者接口。抽象包括两个方面,一个数据抽象,而是过程抽象:

  • 数据抽象:表示事物的特征,就是对象的属性
  • 过程抽象:表示事物的行为,就是对象的行为

封装

封装是面向对象的特征之一,是对象和类概念的主要特性。封装就是把过程和数据包围起来,对数据的访问只能通过已定义的接口。如私有变量用 set,get 方法获取。

封装保证了模块具有较好的独立性,使得程序维护修改较为容易。对应用程序的修改仅限于类的内部,因而可以将应用程序修改带来的影响减少到最低限度。

继承

一种联结类的层次模型,并且允许和鼓励类的重用,提供一种明确表达共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。派生类可以从它的父类哪里继承方法和实例变量,并且类可以修改或增加新的方法使之更适合特殊的需要。

多态

多态是指允许不同的子类对象调用相同方法,但执行结果却不相同。常见的有重写和重载:

  • 重写:子类覆写父类同名方法

父类 Shape 有 draw(),子类 Triangle、Circle、Square 调用后画出不同图形

  • 重载:子类通过修改参数类型、返回类型等创建同名函数

Java 的参数重载、返回类型重载