单例模式

单例模式

原理

  判断是否有这个实例,没有就创建,有就返回它的实例

用途

  在整个过程中只需要一个对象,并提供全局的访问

/**
 * 非透明的单例
 * @describe: 没有显示的new,使用者并不知道这是一个类
 */
function NoTransparentSingle(name) {
  this.name = name;
}
NoTransparentSingle.getinstance = function() {
  // 这里的this指代的是构造函数
  this.instance = this.instance || new NoTransparentSingle();
  return this.instance;
};
let a = NoTransparentSingle.getinstance("熊大");
let b = NoTransparentSingle.getinstance("熊二");
// console.log('非透明的单例', a === b,'第一种写法',a.instance,b.instance,a,b);

// 第二种写法 采用的是闭包的形式
function NoTransparentSingle(name) {
  this.name = name;
}
NoTransparentSingle.getinstance = (function() {
  let instance = null;
  return function(name) {
    instance = instance ? instance : new NoTransparentSingle(name);
    return instance;
  };
})();
let c = NoTransparentSingle.getinstance("熊大");
let d = NoTransparentSingle.getinstance("熊二");
// console.log('非透明的单例', c === d,'第二种写法',c,d);
/**
 * 透明的惰性单例模式
 * @describe:透明 => new (证明是一个类) 惰性 => 并不是类创建的时候就创建了一个实例,而是哪里需要创建才创建一个实例
 */
let TransparentSingle = (() => {
  let instance;
  function TransparentSingle(name) {
    this.name = name;
    if (instance) return instance;
    //  这里进行了一系列处理
    return (instance = this);
  }
  return TransparentSingle;
})();
let e = new TransparentSingle("熊大");
let f = new TransparentSingle("熊二");
// console.log('透明的单例', e === f,'第一种写法',e,f);
/**
 * 通用的单例模式
 */
function generalSingle() {
  let instance;
  return function(fn) {
    return (instance = instance || fn.apply(this, arguments));
  };
}

  转载请注明: 迷一样的自信 单例模式

 上一篇
代理模式 代理模式
代理模式原理  为一个对象提供一个代用品或占位符,以便控制对它的访问。(替身对象对用户的请求做出一些处理后再把请求转发给本体对象) 保护代理  用于对象应该有不同访问权限的情况 虚拟代理  需要代理者帮用户做一些请求(有时自己的一些请求的代
2018-06-07
下一篇 
迭代器模式 迭代器模式
迭代器模式原理  指提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示 用途  可以把迭代的过程从业务逻辑中分离出来,在使用迭代器模式之后,即使不关心对象的内部构造,也可以按顺序访问其中的每个元素。 内部迭代器  
2018-06-05
  目录