设计模式详解(十二):单例模式——Singleton

devtools/2024/12/27 6:36:43/

什么是单例模式

单例模式 (Singleton Pattern) 是一种常见的设计模式,用于确保一个类在整个应用程序运行期间只有一个实例,并提供全局访问点。

本文将详细介绍单例模式的定义、实现方式、优缺点,以及 Android 源码中的使用实例,配以图解与注释。


单例模式的核心目标是:

  1. 唯一性:确保类只有一个实例。
  2. 全局访问:提供对该实例的全局访问。

UML 类图

以下是单例模式的 UML 类图:

Singleton
- static instance: Singleton
- instance
-Singleton()
+getInstance()
-Singleton()
+getInstance()
  • - 表示私有成员。
  • + 表示公共方法。

单例模式的实现方式

1. 饿汉式 (Eager Initialization)

实现

饿汉式在类加载时即创建实例,线程安全,但可能造成内存浪费。

public class Singleton {private static final Singleton INSTANCE = new Singleton(); // 提前创建实例private Singleton() {// 私有构造函数,防止外部实例化}public static Singleton getInstance() {return INSTANCE; // 返回单例实例}
}
图解
App Singleton 加载类 创建实例 获取实例 App Singleton
优缺点
优点缺点
实现简单,线程安全无法延迟实例化,可能浪费资源

2. 懒汉式 (Lazy Initialization)

实现

懒汉式在首次调用时创建实例,但需要处理线程安全问题。

public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
图解
App Singleton 调用 getInstance() 创建并返回实例 App Singleton
优缺点
优点缺点
延迟加载,按需创建实例性能较差,因同步锁增加开销

3. 双重检查锁定 (Double-Check Locking)

实现

双重检查锁定优化了懒汉式的性能,适合多线程环境。

public class Singleton {private static volatile Singleton instance;private Singleton() {// 私有构造函数}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
图解
App Singleton 检查 instance 是否为空 加锁 创建实例 获取实例 App Singleton
优缺点
优点缺点
线程安全,性能较高实现复杂,可能导致可读性下降

4. 静态内部类 (Static Inner Class)

实现

静态内部类方式结合了饿汉式和懒汉式的优点,线程安全且支持延迟加载。

public class Singleton {private Singleton() {// 私有构造函数}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}
图解
App SingletonHolder 调用 getInstance() 返回实例 App SingletonHolder
优缺点
优点缺点
实现简单,线程安全,支持延迟加载无明显缺点

5. 枚举单例 (Enum Singleton)

实现

枚举单例是实现单例模式的推荐方式,简洁且天然线程安全。

public enum Singleton {INSTANCE;public void doSomething() {// 业务逻辑}
}
图解
App Singleton 调用 INSTANCE 返回实例 App Singleton
优缺点
优点缺点
简洁、线程安全、防止反序列化破坏不支持懒加载

Android 源码中的单例模式

1. Application 类

Application 类在整个应用运行期间只有一个实例,属于全局单例。

Application app = context.getApplicationContext();

2. SharedPreferences

SharedPreferences 在内部使用单例模式管理实例。

SharedPreferences prefs = context.getSharedPreferences("prefs", Context.MODE_PRIVATE);

3. OkHttpClient

OkHttp 的 OkHttpClient 通常通过单例模式管理网络请求客户端。

OkHttpClient client = OkHttpClientSingleton.getInstance();

结论

单例模式是一种简单却强大的设计模式,适用于需要全局唯一实例的场景。在 Android 开发中,正确使用单例模式可以提升代码的可维护性与性能,但需注意线程安全问题。

通过理解其不同实现方式及优缺点,开发者可以根据实际需求选择合适的单例实现方法。


http://www.ppmy.cn/devtools/145345.html

相关文章

《软件设计的哲学》阅读摘要之设计原则

《软件设计的哲学》(A Philosophy of Software Design)是一本在软件架构与设计领域颇具影响力的书籍,作者 John Ousterhout 在书中分享了诸多深刻且实用的软件设计理念。书中列举的这些设计原则,汇聚了作者丰富的实战经验与深邃的…

细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV

目录 一、工程配置 1、时钟、DEBUG 2、GPIO 3、SPI2 4、USART6 5、NVIC 二、软件设计 1、FALSH (1)w25flash.h (2) w25flash.c 1)W25Q16基本操作指令 2)计算地址的辅助功能函数 3)器…

Java实现Excel带层级关系的数据导出功能

在Java中实现Excel带层级关系的数据导出,可以使用Apache POI库。Apache POI是一个强大的API,用于操作各种基于Office Open XML标准(OOXML)和微软的OLE 2复合文档格式(OLE2)的文件格式,包括Excel…

workman服务端开发模式-应用开发-vue-element-admin挂载websocket

一、项目根目录main.js添加全局引入 import /utils/websocket 二、在根目录app.vue 中初始化WebSocket连接 <template><div id"app"><router-view /></div> </template><script>import store from ./store export default {n…

重温设计模式--观察者模式

文章目录 观察者模式&#xff08;Observer Pattern&#xff09;概述观察者模式UML图作用&#xff1a;实现对象间的解耦支持一对多的依赖关系易于维护和扩展 观察者模式的结构抽象主题&#xff08;Subject&#xff09;&#xff1a;具体主题&#xff08;Concrete Subject&#xf…

[react]不能将类型“string | undefined”分配给类型“To”。 不能将类型“undefined”分配给类型“To”

场景, 封装组件的时候, 想通过外部传进去一个路由地址, 再用<Link to{}>跳转, 显示这个, 有四种方法解决 第一种 合并运算符 ?? ?? 是 空值合并运算符&#xff08;Nullish Coalescing Operator&#xff09;&#xff0c;它是 JavaScript 和 TypeScript 中的一种逻辑…

逆向工程实战,在反汇编工具中理解汇编与伪C

前言 今天对某外国的机器中的某个音频解码库进行反汇编&#xff0c;发现了一些有趣的知识&#xff0c;故而记录下来&#xff0c;以防以后重复遇到。 现笔者使用的反汇编工具为“Ghidra”。可在GitHub上下载&#xff1a;NationalSecurityAgency/ghidra: Ghidra is a software …

隐马尔科夫模型|前向算法|Viterbi 算法

隐马尔可夫模型 (Hidden Markov Model, HMM) HMM 是一种统计模型&#xff0c;用于表示由一个隐藏的马尔可夫链生成的观测序列。它假设每个观测值依赖于当前的隐藏状态&#xff0c;并且隐藏状态之间的转换遵循马尔可夫性质&#xff08;即未来的状态仅依赖于当前状态&#xff0c…