Lazy loaded image
技术分享
🏭大话设计模式系列(三)-单例模式
字数 874阅读时长 3 分钟
2025-2-9
2025-2-9
type
status
date
slug
summary
tags
category
icon
password
notion image

政府办公楼

想象一下,在一个小镇上,居民们需要办理各种行政手续。如果每个社区都建立一个政府办公楼,那会发生什么呢?
首先,这将造成大量的资源浪费 - 重复的办公设备、人员配置;其次,不同办公楼之间的政策可能不统一,造成混乱;最重要的是,居民们会困惑该去哪个政府办公楼办事。
所以,小镇只建立了一个政府办公楼。无论居民们来自哪个社区,都到这个唯一的政府办公楼办理业务。这就是单例模式的一个完美比喻 - 确保某个"实例"在系统中只存在一个。

单例模式的优点

  • 节省资源:就像一个政府办公楼就够了一样,单例模式避免了创建多个实例带来的内存浪费
  • 统一管理:类似于政府政策的统一性,单例模式确保了对共享资源的一致访问和控制
  • 全局访问点:就像所有人都知道政府办公楼在哪里一样,单例模式提供了一个全局访问点

单例模式的缺点

  • 单点故障:如果唯一的政府办公楼出现问题,整个城市的行政工作都会受影响
  • 扩展性差:当城市发展太大时,单一的政府办公楼可能应付不过来
  • 测试困难:全局状态使得单元测试变得复杂
notion image

代码实现

下面我们用Go语言实现一个线程安全的单例模式:
让我们来分析这段代码的技术实现:
  • sync.Once:Go标准库提供的同步原语,确保初始化代码只执行一次,即使在多个goroutine并发访问的情况下也是线程安全的
  • 延迟初始化:单例实例在第一次调用GetInstance()时才会被创建,这种方式称为懒汉式加载(Lazy Loading)
  • 封装性:通过将instance变量声明为包级私有变量,确保外部无法直接访问和修改单例实例
使用示例:
这个实现保证了在整个应用程序生命周期中,只会创建一个Government实例,并且这个实例可以安全地在多个goroutine之间共享。这种实现方式既保证了线程安全,又避免了使用互斥锁带来的性能开销。
注意:虽然单例模式实现起来看似简单,但在实际使用时需要谨慎。它可能会导致代码之间的紧耦合,并且在某些场景下可能违反单一职责原则。建议在确实需要全局唯一状态时才使用单例模式。
上一篇
轻松搭建你自己的监控服务-Uptime Kuma
下一篇
大话设计模式系列(二)-抽象工厂模式

评论
Loading...