zoukankan      html  css  js  c++  java
  • 设计模式之单例模式

    第一次知道单例模式,是看的java21种设计模式,当时对于里面讲的懒汉式、饿汉式啥的都不太明白什么意思,就只是知道单例模式里面还有这两种区别。

    既然这几天看的vuex是使用了这种模式,那么就特地写一篇博客来谈谈现在我对单例模式的理解吧。

    一、名词解释、结合vuex

    单例模式,顾名思义,就是只有一个实例化对象。也就是说在内存中他的地址是唯一的,但是可以到处引用,因此:

    单例模式要求类能够有返回对象一个引用和一个获得该实例的方法。这是java中的释义,因为java中方法从属于某个类(其实在ES6中也已经支持class的写法了)

    所以,针对上一篇的vuex的单例模式,你会看到如下代码:

    const store = new Vuex.Store({
        modules: {
            header,
            sidebar,
            topbar,
            user,
            program,
            evaluation
        },
        getters
    })
    
    export default store

    这是模块化的写法,但是你不难看出,他对外暴露了一个对象的引用(Vuex对象),然后在main.js中:

    new Vue({
      el: '#app',
      router,
      store,
      i18n,
      render: h => h(App)
    })

    这样一来,全局注册store使得我们能在全局使用store,又因为这个store是对象的引用,所以在内存中至始至终只有一个Vuex.Store对象

    二、懒汉式和饿汉式

    所谓懒汉式呢,就像名字说的那样,他很懒,你不主动实例化对象的话,他就永远只是一个变量名,就像var obj;你知道obj是什么么?不知道,因为你没赋值啊。

    所谓饿汉式,就是不管三七二十一,上来就给你实例化,var a = new Obj(),他才不管你后面会不会用到a,先给你实例化到内存里面再说。

    三、线程的问题

    对于js来说,是不存在线程安全不安全一说的,因为js是单线程的(不要提H5的多线程解决方案web workers),所以在懒汉式的问题上不存在线程安全一说。

    但是对于java这种可以开启多线程的语言来说,用懒汉式来实例化对象是存在线程安全的问题的,具体解决方案,大家可以参考这篇博客:单例模式的8种写法。

    四、使用场景

    对于资源共享(工具方法)、信息共享(状态管理)我们都可以使用单例模式。

  • 相关阅读:
    for...else...
    js 代码运行中插入交互
    八皇后问题(python)
    多层for循环转递归/迭代
    迭代器/可迭代对象/生成器
    js,python,go 协程对比
    Promise精简总结
    PyQt常用组件用法总结
    PyQt5 接入 web 登录页
    C++求整型数组的和
  • 原文地址:https://www.cnblogs.com/eco-just/p/10503999.html
Copyright © 2011-2022 走看看