单例模式

单例模式

1. 特点

  • 系统中被唯一使用
  • 一个类只有一个实例
  • 单例模式需要用到 java 的特性(private)
  • ES6 中没有(ts 除外)

2. UML 演示

在这里插入图片描述

3. 代码演示

  • java 代码

    public class SingleObject{
         //唯一被 new 出来的对象
      private SingleObject instance = null;
      
      //私有化构造函数,外部不能有 new,只能内部 new
      private SingleObject(){
      }
      //获取对象的唯一接口
      private SingleObject getInstance(){
        if(instance == null){
          //只 new 一次
          instance = new SingleObject();
        }
      }
      return instance;
    
      //对象方法
      public void showMessage(){
            System.out.println("show...");
      }
    
    public class SingletonPatterDemo{
      public static void main(String[] args){
        //不合法的构造函数
        //编译时错误:构造函数SingleObject()是不可见的
        //SingleObject object = new SingleObject();
    
        //获取唯一可用的对象
        SingleObject object = SingleObject.getInstance();
        object.login();
      }
    }
    
  • JS 代码

    class SingleObject {
      login() {
        consolg.log('login...')
      }
    }
    
    SingleObject.getInstance = (function() {
      let instance
      return function() {
        if (!instance) {
          instance = new SingleObject()
        }
        return instance
      }
    })()
    
    //测试:注意这里只能使用静态函数getInstance,不能使用new SingleObject()
    let obj1 = SingleObject.getInstance()
    obj1.login()
    let obj2 = SingleObject.getInstance()
    obj2.login()
    console.log('obj1 === obj2 is', obj1 === obj2) //true
    let obj3 = new SingleObject()
    console.log('obj1 === obj3 is', obj1 === obj3) //false
    

4. 场景

4.1 jQuery 只有一个$

//jQuery只有一个  $
if (window.jQuery != null) {
  return window.jQuery
} else {
  //初始化...
}
  • 模拟登录框
class LoginForm {
  constructor() {
    this.state = 'hide'
  }

  show() {
    if (this.state === 'show') {
      alert('show')
      return
    } else {
      this.state = 'show'
      console.log('登录框已显示')
    }
  }
  hide() {
    if (this.state === 'hide') {
      alert('hide')
      return
    } else {
      this.state = 'hide'
      console.log('登录框已隐藏')
    }
  }
}
LoginForm.getInstance = (function() {
  let instance
  return function() {
    if (!instance) {
      instance = new LoginForm()
    }
    return instance
  }
})()

//测试
let login1 = LoginForm.getInstance()
login1.show()

let login2 = LoginForm.getInstance()
login2.show()

console.log('login1 === login2 is', login1 === login2)

4.2 购物车

4.3 vuex 和 redux 中的 store

5. 设计原则

  • 符合单一职责原则,只实例化唯一的对象
  • 没法具体体现开放封闭原则,但没有违反开放封闭原则
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值