vlambda博客
学习文章列表

设计模式篇(2):单例模式

问题导入

> 何为单例模式> 单例模式存在的优势是什么> 单例模式的应用场景有哪些> Js中如何实现单例模式> Ts中单例模式又应该如何实现

我将以以上五个方面介绍单例模式的内容:

何为单例模式:

单例模式也是我们23三种设计模式中的一种代码编写的模式,根据具体的编码需求,可以保证一个类只会有一个实例对象,所有拿到这个类的实例对象都是完全相同的  ---->这里给一张单例模式的简单UML类图:

单例模式存在的优势是什么

1. 首先,单例模式通过减少类实例的创建可以达到节约资源的目的

2. 保证所有的类实例对象都是相同的,保证类数据的共享,让多个线程或者进程之间可以实现数据通信(这里需要注意的是Js是单线程的,所以这个优势在Java中可能更加的明显)


单例模式的应用场景

(我们以实际的例子来列举单例模式的应用场景)

1. 在我们的商城系统中的购物车模块只能有一个具体的实例,保证购物车数据的单一性。

2. 使用Jquery库时,只有一个唯一的$对象 

3. 框架中常用到的Vuex和Redux中创建的Store只有一个实例来实现整个系统的数据共享

............

关于单例模式的实现:

单例模式中常会提到三种模式:懒汉模式,饿汉模式,双重检测机制。但是由于Js语言的特性,双重检测的机制无法实现,所以我们就只实现懒汉和饿汉两种模式:

Js实现单例模式懒汉模式

/*** 所谓懒汉模式,就是在第一次调用类获取实例对象的时候才进行实例化,达到一个懒加载的效果* 由于Js中没有private这样的访问限定符,所以我们只能够通过一些特殊的方式来达到获取单例的效果*/const Singleton = (function(){ let instance = null; class SingletonObject{   show(){ console.log("这是SingletonObject类") } } return function(){ if(!instance){ instance = new SingleObject(); } return instance; }})()const s1 = new Singleton();const s2 = new Singleton();console.log(s1 === s2) // true

这里简单描述一下实现的思路:由于无法使用访问限定符避免类的实例,所以我们采用模块化的方式,使用闭包进行处理。将实际的类创建在一个模块域内,同时通过闭包的机制让外部通过外层的构造函数实例得到的类对象是同一个单例

Js单例模式饿汉模式

/*** 所谓饿汉模式,就是在创建类的时候就立即初始化,这样对于调用的效率能够有一定的提高* 它和懒汉模式唯一的区别就是在创建单例的时机上不同*/
const Singleton = (function(){  class SingletonObject{    show(){      console.log("这是SingletonObject类")    }  }  let instance = new SingletonObject();  return function(){    return instance;  }})()
const s1 = new Singleton();const s2 = new Singleton();console.log(s1 === s2) // true



TS中单例模式的实现

Ts是一门静态语言,所以它的实现就是和Java这样的静态语言的实现类似了。这里只以懒汉模式为例:

/*** 使用Ts实现单例模式,主要是使用private修饰符修饰调类得到构造函数,避免外部直接实例化,然后暴露给外部一个获取唯一实例的接口*/class SingletonObject{ // 定义单例模式的唯一实例 private static instance: SingletonObject; // 获取类单例的接口方法 static getInstance(){ if(!SingletonObject.instance){ SingletonObject.instance = new SingletonObjet(); } return SingletinObject.instance; } // 私有的类构造函数 private constructor(){ // do something }}

对于Ts中的饿汉模式就留给大家自己去尝试了哦!!


关于单例模式的内容就说到这里了,大家 加油!!!!