• 单例模式定义及其基础示例


    定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
    惰性单例:在需要的时候才创建实例。

    基本逻辑

    let p = null
    if (!p) {
      p = 'xxx'
    }
    
    • 1
    • 2
    • 3
    • 4

    闭包写法

    以创建对话框 DOM 为例

    <body>
      <button id="btn">Create Modalbutton>
    body>
    
    <script>
      const createModal = (function() {
        let Modal = null
        return function() {
          if (!Modal) {
            Modal = document.createElement('div')
            Modal.innerHTML = 'I am Modal component'
            Modal.style.display = 'none'
            document.body.appendChild(Modal)
          }
          return Modal
        }
      })()
    
      const btn = document.querySelector('#btn')
    
      const callback = () => {
        const Modal = createModal()
        console.log('Modal = ', Modal);
        Modal.style.display = 'block'
      }
      btn.addEventListener('click', callback)
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    虽然这里实现了基本功能:第一次点击按钮时生成 Modal DOM,以后每次点击只会调用 callback 函数,不再生成额外 Modal DOM。
    但还是有一些问题

    • 违反单一职责原则,创建 Modal 和管理单例的逻辑都放在 createModal 对象内部
    • 如果我们需要创建页面唯一的 iframe、script 或其他组件,就必须把 createModal 复制一遍

    通过将可变不可变的部分隔离开,我们可以换种写法

    通用写法

    把创建对象和管理单例的职责成功区分开

    <body>
      <button id="btn">Clickbutton>
    body>
    <script>
      const useSingleton = function (fn) {
        // 创建指针
        let p = null
        return function () {
          return p || (p = fn.apply(this, arguments))
        }
      }
    
      const createModal = () => {
        const Modal = document.createElement('div')
        Modal.innerHTML = 'I am Modal Component!'
        Modal.style.display = 'none'
        document.body.appendChild(Modal)
        return Modal
      }
    
      const createSingleModal = useSingleton(createModal)
    
      const callback = () => {
        const Modal = createSingleModal()
        console.log('Modal = ', Modal)
        Modal.style.display = 'block'
      }
    
      const btn = document.querySelector('#btn')
      btn.addEventListener('click', callback)
    script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    更多代码可在 GitHub 获取~

  • 相关阅读:
    【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】
    token_to_image
    【C语言】等边等腰三角形的判断
    【数据结构】12.排序
    C语言每日一题
    仪表基础知识培训
    gson如何序列化子类
    数据结构的无头单向链表
    ovirt:api接口+keystone接口+neutron接口示例
    Oracle数据库更改账号密码,设置账号有效期
  • 原文地址:https://blog.csdn.net/weixin_44184425/article/details/126239093