• 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
  • 相关阅读:
    ASP.NET 2.0 中改进的缓存功能
    Python 一门神奇的语言
    showModalDialog()、showModelessDialog()方法使用详解
    在VS2005中 GridView导入Excel的两点小技巧附源码
    DVB码流中业务信息与电子节目指南
    js 日历控件
    js收藏
    什么是ECM,EMM,AU,EMU?
    精解PSISI(一)
    Oracle第四课(学习笔记)
  • 原文地址:https://www.cnblogs.com/xiaoliziaaa/p/13786190.html
Copyright © 2020-2023  润新知