zoukankan      html  css  js  c++  java
  • 03单例模式

    最简单的单例模式

    class Window {
      constructor(name) {
        this.name = name;
      }
      static getInstance() {
        // 静态方法 this是Window类
        // 第一次走new window方法 ,第二次this.instance就有值,用自己的
    
        this.instance = this.instance || new Window
        return this.instance
    
      }
    }
    const w1 = Window.getInstance()
    const w2 = Window.getInstance()
    console.log(w1 === w2); //true
    View Code

    两个缺点:

    1.调用者必须知道Window类有getInstance静态方法。

    2.不能阻止调用者new Window().这样会产出多个实例对象。

    透明单例

    class Window {
      constructor(name) {
        this.name = name;
      }
      getName() {
        console.log(this.name);
      }
    }
    const CreateSingleton = (function () {
      let instance = null
      return function CreateSingleton(name) {
        instance = instance || new Window(name)
        return instance
    
      }
    
    })()
    const w1 = new CreateSingleton('w1') //new 可以不用
    const w2 = new CreateSingleton('w2')
    console.log(w1 === w2); //true
    View Code
    扩展透明单例:如果有多个类,而创建单例的逻辑是一样的。
    class Window {
      constructor(name) {
        this.name = name;
      }
      getName() {
        console.log(this.name);
      }
    }
    
    class Dialog {
      constructor(title, content) {
        this.title = title;
        this.content = content;
      }
    }
    
    const CreateSingleton = function (Constructor) {
      let instance = null
      return function (...args) {
        instance = instance || new Constructor(...args)
        return instance
    
      }
    
    }
    // 创建Window单例
    const CreateWindow = CreateSingleton(Window) //创建Window单例
    const w1 = new CreateWindow('w1') //new 可以不用
    const w2 = new CreateWindow('w2')
    // 创建Dialog单例
    const CreateDialog = CreateSingleton(Dialog)
    const d1 = new CreateDialog('t1', 'c1')
    const d2 = new CreateDialog('t2', 'c2')
    console.log(d1); //Dialog { title: 't1', content: 'c1' }
    console.log(d2); //Dialog { title: 't1', content: 'c1' }
    View Code
  • 相关阅读:
    Flex通信-Java服务端通信实例
    myeclips破解
    最简单的基于FFmpeg的移动端例子:Android 视频转码器
    Kapacitor行为测试
    mydumper备份原理和使用方法
    csdn课堂学习
    maven 遇到failOnMissingWebXml有关问题解决方法
    Oracle中NVL、NVL2、DECODE函数的用法
    Mybatis 一对多 多对1
    Linux编译ffmpeg
  • 原文地址:https://www.cnblogs.com/xiaoliziaaa/p/13786190.html
Copyright © 2011-2022 走看看