Skip to content

单例模式

是什么?

产生一个类的唯一实例,可重复使用的,避免产生多个实例,造成性能的消耗。

在 JS 中,就是用闭包来实现

javascript
function getDom() {
  let dom = undefined
  return function(result) {
    console.log(dom)
    return dom || (dom = result)
  }
}

const instance = getDom()

instance(document.querySelector('body')) // undefined
instance() // dom
javascript
// 使用原型实现
function Person() {
  if (typeof Person.instance === 'object') {
    console.log('signle')
    return Person.instance
  }
  this.value = 'test'
  // new 操作会执行一遍函数,最后 instance 把指向自身
  Person.instance = this
}

const t1 = new Person()
const t2 = new Person()

console.log(t1 === t2) // true,是同一个对象

有什么用?

避免产生多个实例,造成性能消耗。

工厂模式

是什么?

工厂模式简单来说就是为了创建对象,解决多个类似对象声明的问题

简单工厂模式

把相似的属性抽象出来,每次调用,根据参数,生成新一个对象

javascript

function Factory(type, ...arg) {
  const types = {
    shirt: Shirt,
    shoe: Shoe
  }
  return (new types[type](...arg))
}

function Shirt(name) {
  this.name = name
}

function Shoe(name, size) {
  this.name = name
  this.size = size
}

const shirt = Factory('shirt', 'shirt')
const shoe = Factory('shoe', 'shoe', 17)

// 这种和通过原型创造对象有点类似
function Factory(type) {
  const o = new Object()
  o.type = type
  return o
}

有什么用?

  • 当对象或组件涉及高复杂性时
  • 当需要根据所在的不同环境轻松生成对象的不同实例时
  • 当处理很多共享相同属性的小型对象或组件时

观察者模式

是什么?

一个目标对象管理所有相依于它的观察者对象,并且在它本身的状态改变时主动发出通知。这通常透过呼叫各观察者所提供的方法来实现。此种模式通常被用来实时事件处理系统

观察者模式有两种对象,一个是目标对象,一个是观察者对象。观察者对象像某个目标注册特定的事件,当目标出发某一事件时,会调用观察者注册的的方法。

观察者模式可以一对多或多对多

javascript
const subject = new Subject()
const observer = new Observer()
const observer2 = new Observer()

observer.addListener('update', subject, () => { ... })
observer2.addListener('update', subject, () => { ... })

有什么用?

用于解耦各个模块。在 JS 里面的 DOM 的监听事件,就是观察者模式,当触发了某个交互行为时,就会执行注册的那个回调函数。

发布订阅模式

和观察者模式很想,在发布-订阅模式,消息的发送方,叫做发布者(publishers),消息不会直接发送给特定的接收者,叫做订阅者

有三种对象,发布者、事件代理和订阅者

区别:

文档

装饰者模式

是什么?

有什么用?

适配器模式

是什么?

我的理解是,就像一个充电转接口,对输入的进行转换,再给到另外一端。

有什么用?

像平时开发项目的时候,有时候后端修改了接口的几个字段名,而前端已经写好逻辑,全局替换字段名也不合适,容易替换错、麻烦等,在请求到数据后,做一层转换的逻辑

javascript
// 转换
function change(data) {
  return {
    ...data,
    key: data.type // 这样的转换
  }
}