javascript 设计模式 - 单例模式实现及应用

1.单例模式解释

单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返回,这就确保了一个类只有一个实例对象。在JavaScript里,单例作为一个命名空间提供者,从全局命名空间里提供一个唯一的访问点来访问该对象。

2.应用场景举例 

登录页
购物车
vuex
全局loading遮罩

......

3.代码解释

1.通过闭包和立即执行函数实现

var singletonPatten = (function() {
  // 单例构造函数
  function singleton(arg) {
    var arg = arg || {}
    this.x = arg.x || 1
    this.y = arg.y || 1
  }
  // 单例实例容器
  var instance 

   return function(arg) {
     if(!instance) {
       instance = new singleton(arg)
     }
     return instance  }
}())

var singletonTest1 = singletonPatten({x: 2, y: 7})
var singletonTest2 = singletonPatten()singleton1.z = 3
console.log(singletonTest1 === singletonTest2)  //true
console.log(singletonTest2.x)   // 2console.log(singletonTest2.z)   // 3

第一次取实例时, 把singleton实例存到instance中,第二次实例已经存在直接返回instance,所以第一次获得的实例和第二次获得的实例是相同的。

2.通过构造函数实现

function Singleton(arg) {
  //实例是否已存在
  if(typeof Singleton.instance === 'object') {
    return Singleton.instance
  }
  var arg = arg || {}
  this.x = arg.x || 1
  this.y = arg.y || 1

  //缓存实例
  Singleton.instance = this
}

var singleton1 = new Singleton({x: 2, y: 2})
var singleton2 = new Singleton()
singleton1.z = 3
console.log(singleton1 === singleton2)  //true
console.log(singleton2.x)  //2
console.log(singleton2.z)  //3

获得构造函数实例前先判断instance是否存在,存在则直接返回,否则将构造函数中的this进行缓存,下次取实例可以直接返回第一次获得的实例

3.构造函数重构实现

function Singleton(arg) {
  var arg = arg || {}
  //缓存实例
  var instance = this
  this.x = arg.x || 1
  this.y = arg.y || 1

  //重构构造函数
  Singleton = function() {
    return instance  }}

var singleton1 = new Singleton({x: 2, y: 2})
var singleton2 = new Singleton()
singleton1.z = 3
console.log(singleton1 === singleton2)   //true
console.log(singleton2.x)   //2
console.log(singleton2.z)   //3

第一次获得实例先将实例缓存到instance中,然后就构造函数进行一个重构,重构后的构造函数直接返回缓存的实例instanceof,第二次获得后便直接返回直接缓存的实例

4.通过class类实现

class Singleton {
  constructor(arg) {
    var arg = arg || {}
    this.x = arg.x || 1
    this.y = arg.y || 1
  }
  static getInstance(arg) {
    if(!Singleton.instance) {
      Singleton.instance = new Singleton(arg)
    }    return Singleton.instance  }
}

var singleton1 = Singleton.getInstance({x: 2, y: 2})
var singleton2 = Singleton.getInstance()
singleton1.z = 3
console.log(singleton1 === singleton2)   //true
console.log(singleton2.x)   //2
console.log(singleton2.z)   //3

静态方法getInstance获取类的实例,先判断instance上面是否缓存实例,没有缓存,如果存在直接返回。

  

 4.实际应用场景

实现一个全局loading遮罩框

class Loading {
  constructor() {
    this.visile = false
  }
  show() {
    if(this.visile) {
      console.log('已经展示')
      return true
    }
    this.visile = true  }
  hide() {
    if(!this.visile) {
      console.log('已经隐藏')
      return true
    }
    this.visile = false
  }
  static getLoadingMask() {
    if(!Loading.instance) {
      Loading.instance = new Loading()
    }
    return Loading.instance
  }
}

上述代码,定义了一个loading遮罩的类,有两个实例方法,show和hide,还有一个静态类getInstanceMask

当两处地方需要获得loading遮罩实例进行操作

var loading1 = Loading.getLoadingMask()
var loading2 = Loading.getLoadingMask()
console.log(loading1 === loading2)   //true
loading1.show()
loading1.hide()
loading1.show()
loading2.show()   //已经展示
loading2.hide()
loading2.hide()   //已经隐藏

当对loading1和loading2执行show方法,第二次执行show会报已经展示,表示是同一个laoding遮罩实例

这样就实现了一个单例模式的实际应用场景。

其他的如基于vue的vuex就是最典型的单例模式,因为它的全局状态管理器,只能存在一个,不能多个。

单例模式实际为了节省资源而存在的一种模式,也是很常见的一种模式之一。

end !!!

(0)

相关推荐

  • C#(九)基础篇—静态成员与异常处理

    C# 本随笔为个人复习巩固知识用,多从书上总结与理解归纳得来,如有错误烦请指正  静态成员 在定义类的成员属性或方法时加上static,即表示它是一个静态成员,静态成员不能被类的对象引用,值被所有对象 ...

  • 基于多线程任务队列执行时间测试——泛型单例模式落地

    目录 基于多线程任务队列执行时间测试--泛型单例模式落地 1.需求 2.遇到的问题 3.解决思路 4.具体代码 4.1泛型单例 4.2 开始时间实体 4.3 实例化单例 4.4 获取任务结束时间 5. ...

  • 前端设计模式总结

    菜鸟看书的一点总结,请大佬给出宝贵意见 创建型 工厂模式 创建对象的工厂,使用者不必关心对象生成的过程,也就是不需要显示的调用new 操作符,只需要调用对象工厂暴露出来的创建对象的方法,并传入需要创建 ...

  • 设计模式-创建型-单例模式

    前言: 单例模式,顾名思义,只存在一个实例.官方定义:对于类的单例模式设计,就是采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法(静态方法). ...

  • 设计模式-单例模式

    单例模式 优点 由于单例模式在内存中只有一个实例,减少了内存开支,特别是 一个对象需要频繁地创建.销毁时,而且创建或销毁时性能又无法优 化,单例模式的优势就非常明显. 由于单例模式只生成一个实例,所以 ...

  • 【转】C#设计模式-单例模式(Singleton Pattern)

    目录 介绍 第一个版本 --不是线程安全的 第二个版本 -- 简单的线程安全 第三个版本 - 使用双重检查锁定尝试线程安全 第四个版本 - 不太懒,不使用锁且线程安全 第五版 - 完全懒惰的实例化 第 ...

  • 浅谈C++设计模式--单例模式

    单例模式(Singleton)[分类:创建型] [目的:为程序的某个类的访问,提供唯一对象实例] 这估计是设计模式里面最简单的一个类了,下面我们一起看看,单例它是什么?以及如何实现一个单例 基本定义 ...

  • 设计模式-单例模式code

    package singeton; import java.security.SecureRandom; /** * @author Zero * @since 2019-08-13. * Descr ...

  • JAVA设计模式---单例模式篇

    单例模式(singleton):是JAVA中最简单的一种设计模式,属于创建型模式.所谓单例,就是整个程序有且仅有一个实例. 特点: 构造方法私有化 在本类中实例化一个对象作为本类的属性 对外提供一个访 ...

  • JavaScript设计模式之观察者模式

    目录 简介 实现 创建观察者对象 简介 观察者模式由称作发布-订阅者模式或消息机制,该模式定义一种依赖关系,旨在解决主体对象与观察者之间功能的耦合. 例如案例:想实现一个评论模块,当用户发送消息时,在 ...

  • 创建型设计模式--单例模式

    一.单例模式 1.什么是单例模式 采取一定的方法,使程序中的某个类只存在一个实例对象,且该类对外提供一个获取该对象的方法(一般为静态方法). 2.单例模式分类 (1)饿汉式(2种写法,线程安全) 静态 ...

  • Java设计模式-单例模式

    单例模式的定义 在<Java与模式>书中这样说到:作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个类称为单例类. 单例模式的特点 从单例模 ...

  • JavaScript设计模式基础(一)

    模式的起源 模式 起源于建筑学.20世纪70年代,哈佛大学建筑学博士Christopher Alexander和他的团队花大约20年,来研究为解决同一个问题而设计出的不同建筑结构,从中发现那些高质量设 ...