design mode

196 阅读2分钟

1.单例模式

  • 创建唯一实例
  • 单例模式应用广泛,有些对象只需要创建一个,例如线程池,全局缓存,浏览器中的window对象等。
  • 业务开发中,单例模式应用也十分广泛,例如处理页面弹窗时,点击按钮产生一个弹窗,如果多次点击,每次都会创建一个新的弹窗组件,十分消耗性能。
  • 单例模式的核心思想是确保一个类只对应一个实例,每次调用构造函数时,返回指向同一个对象的指针,也就是说,我们只在第一次调用构造函数时,创建新对象,之后的所有调用,返回该对象即可。
  • 核心思想:用变量进行缓存

1.1 ES5写法

var Singleton = function(name) {
  this.name = name;
  this.instance = null;  // 标志位,缓存
}

Singleton.prototype.getName = function() {
  console.log(this.name);
}

Singleton.getInstance = function(name) {
  // console.log('xxx', this.instance)
  if(!this.instance) {
    this.instance = new Singleton(name);
  }
  return this.instance;
}

var a = Singleton.getInstance('a')
var b = Singleton.getInstance('b')
console.log(a, b, a=== b)
console.log(a.getName(), b.getName())

1.2 闭包写法

  • 闭包demo
var user = (function() {
  var name = 'user';
  return {
    getName: function() {
      console.log(name);
      return name;
    }
  }
})();  //立即执行,返回一个对象

console.log(user.getName())
  • 闭包写法
// 使用闭包包裹  优雅的设计标志位
// 闭包外部无法修改,前一种外部可以修改标志位

/*
** __instance不暴露出去对这个闭包修改的话,单例模式里的缓存是永远不会被改变的
*/
var ProxySingleton = (function() {
  var __instance = null;
  return function(Func) {
    if(!__instance) {
      __instance = new Func();
    }
    return __instance;
  }
})(); 

function A() {
  this.name = Math.random();
}

var a = new ProxySingleton(A);
var b = new ProxySingleton(A);
console.log(a, b, a === b)

2.观察者模式

  • 观察者模式又叫发布订阅模式
  • 定义对象间一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都将得到通知和更新
  • 观察者模式提供了一个订阅模型,其中对象订阅事件,并在发生时得到通知,这种模式是事件驱动的编程基石
  • 核心:全局队列,发生,触发队列
  • 应用于异步场景,回调触发

3.代理模式

  • 基于函数或者组件处理一些通用模式
  • 为一个对象提供一个代用品或者占位符,以便来控制对他的访问
  • 代理模式的关键是,当客户不方便直接访问一个对象,或者不满足需要的时候,提供一个提神对象来控制对这个对象的访问,客户实际上访问的是替身对象,替身对象对请求作出一些处理之后再把请求对象转交给本体对象