使用private构造器 or 枚举的原生语言实现单例

简介: 相信接触过设计模式的同学都知道,单例的一种经典实现方式就是private的构造函数,但直到我看到这一章节内容的时候,才突然顿悟原来枚举类型也是可以强化单例属性的,自愧个人的融会贯通能力还有待加强。

相信接触过设计模式的同学都知道,单例的一种经典实现方式就是private的构造函数,但直到我看到这一章节内容的时候,才突然顿悟原来枚举类型也是可以强化单例属性的,自愧个人的融会贯通能力还有待加强。

实现单例方式一:


// Singleton with public final field
public class Elvis {
  public static final Elvis INSTANCE= new Elvis();
  private Elvis() { .. . }
}


这种实现方式有一个缺点就是可以借助反射机制里的AccessibleObject.setAccessible来强制修改构造函数成为public的

实现单例方式二:


// Singleton with static factory
public class Elvis {
private static final Elvis INSTANζE = new Elvis();
  private Elvis() { ... }
  public static Elvis getInstance() {return INSTANCE; }
}


在实际抉择中,如果用到了以下某种优势,则优先考虑第二种实现,否则考虑第一种单例实现:


可以很容易被修改成非单例的(修改getInstance的返回语句即可)

可以使用Elvis::instance语法


此外,为了防止每次序列化和反序列化都创建一个新实例而破坏了单例特性,需要在Elvis类中添加一个方法:


private Object readResolve () {
  return INSTANCE;
}


实现单例方式三:


这种方式也是我原先没有想到的,声明包含单个元素的枚举类型来实现:

public enum Elvis {
  INSTANCE;
  public void leaveTheBuilding() { .. . }
}


其中Elvis.INSTANCE可以获得单例,Elvis.INSTANCE.leaveTheBuilding();调方法。


这种方式也是作者极力推荐的一种方式,无偿地提供了序列化机制,绝对防止多次实例化。单元素的枚举类型经常成为实现Singleton的最佳方法。

相关文章
|
移动开发 搜索推荐 前端开发
《HTML 简易速速上手小册》第10章:HTML 的维护与优化(2024 最新版)
《HTML 简易速速上手小册》第10章:HTML 的维护与优化(2024 最新版)
101 0
|
Shell Linux 开发工具
Docker Dockerfile探究
Docker Dockerfile探究
143 2
|
存储 编译器 C++
【C++杂货铺】探索list的底层实现
【C++杂货铺】探索list的底层实现
111 0
|
存储 Linux 对象存储
如何利用用云存储网关作为Windows docker存储访问OSS
本文像用户介绍在windows的容器环境中,如果利用阿里云云存储网关的smb共享作为后端存储,实现docker容器内的数据上云,在docker中直接访问对象存储OSS中的数据。
2901 0
如何利用用云存储网关作为Windows docker存储访问OSS
《我看电商》读书笔记
摘抄: 干起架来,结实的小个子胜过松松垮垮的大个子。 集中在一点,往死里打。 人事部门最主要的职能是文化建设、规章制度执行。 天猫的过滤:一个品牌,3个经销商 做企业管理,不能不时时算细账,每个环节,每个费用的构成 配送模式之一:亚马逊每年99美元包配...
1444 0
|
12天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1262 5
|
1天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!