执迷 执迷
首页
  • 技术分享

    • 小白都能看懂的闭包
    • GO-GMP模型
    • MySQL调优
    • centos7部署nacos
    • elasticserch
    • redis
  • 发布一个node插件

    • 发布一个npm包
    • 如何打包一个插件工具库
    • 打包工具的选择
  • JavaScript
  • ES6
  • CSS
  • 框架
  • Node
  • 服务
  • 其他
自我介绍
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

执迷

代码也是艺术
首页
  • 技术分享

    • 小白都能看懂的闭包
    • GO-GMP模型
    • MySQL调优
    • centos7部署nacos
    • elasticserch
    • redis
  • 发布一个node插件

    • 发布一个npm包
    • 如何打包一个插件工具库
    • 打包工具的选择
  • JavaScript
  • ES6
  • CSS
  • 框架
  • Node
  • 服务
  • 其他
自我介绍
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • JavaScript

  • ES6

  • CSS

  • 框架

  • Node

  • 服务

  • 其他

  • 设计模式

    • 前言
    • 创建型-工厂模式
    • 创建型-单例模式
      • 场景
      • 实现
      • 静态方法版
      • 闭包版
      • 优点
      • 总结
    • 装饰器
  • web3

  • react

  • 学习笔记
  • 设计模式
执迷
2022-12-31
目录
场景
实现
静态方法版
闭包版
优点
总结

创建型-单例模式

# 场景

在一个系统中可能只有一个数据库连接、一个网络连接或一个唯一的配置文件。在这些情况下,使用单例模式可以确保系统中只有一个实例,从而避免问题的发生。单例模式还可以用于对象缓存、日志系统和对象池等。需要注意的是,使用单例模式并不是解决所有问题的万能药,过度使用单例模式可能会导致软件设计的不灵活,并且难以测试和维护。因此,在使用单例模式时要谨慎考虑。

# 实现

使用单例模式对localStorage 进行封装。实现方法 setItem(key,value) 和 getItem(key)。

# 静态方法版

// 定义Storage
class Storage {
    static getInstance() {
        // 判断是否已经new过1个实例
        if (!Storage.instance) {
            // 若这个唯一的实例不存在,那么先创建它
            Storage.instance = new Storage()
        }
        // 如果这个唯一的实例已经存在,则直接返回
        return Storage.instance
    }
    getItem (key) {
        return localStorage.getItem(key)
    }
    setItem (key, value) {
        return localStorage.setItem(key, value)
    }
}

const storage1 = Storage.getInstance()
const storage2 = Storage.getInstance()

storage1.setItem('name', '李雷')
// 李雷
storage1.getItem('name')
// 也是李雷
storage2.getItem('name')

// 返回true
storage1 === storage2
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

# 闭包版

// 先实现一个基础的StorageBase类,把getItem和setItem方法放在它的原型链上
function StorageBase () {}
StorageBase.prototype.getItem = function (key){
    return localStorage.getItem(key)
}
StorageBase.prototype.setItem = function (key, value) {
    return localStorage.setItem(key, value)
}

// 以闭包的形式创建一个引用自由变量的构造函数
const Storage = (function(){
    let instance = null
    return function(){
        // 判断自由变量是否为null
        if(!instance) {
            // 如果为null则new出唯一实例
            instance = new StorageBase()
        }
        return instance
    }
})()

// 这里其实不用 new Storage 的形式调用,直接 Storage() 也会有一样的效果 
const storage1 = new Storage()
const storage2 = new Storage()

storage1.setItem('name', '李雷')
// 李雷
storage1.getItem('name')
// 也是李雷
storage2.getItem('name')

// 返回true
storage1 === storage2

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
32
33
34
35

# 优点

单例模式可以保证系统中有且仅有一个实例,降低了系统的复杂度; 单例模式可以控制对象的创建,提供访问入口; 单例模式可以避免对资源的多重占用。

# 总结

保证一个类仅有一个实例,并提供一个访问它的全局访问点,这样的模式就叫做单例模式。

上次更新: 2024/07/21, 21:46:04
创建型-工厂模式
装饰器

← 创建型-工厂模式 装饰器→

最近更新
01
MySQL调优 原创
08-04
02
MySQL底层 原创
07-30
03
consul单台机器部署,注册外网服务健康检查 原创
07-30
更多文章>
Theme by Vdoing | Copyright © 2019-2025 执迷 | 闽ICP备2022018045号 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式