什么是单例模式
单例模式 (Singleton Pattern) 是一种常见的设计模式,用于确保一个类在整个应用程序运行期间只有一个实例,并提供全局访问点。
本文将详细介绍单例模式的定义、实现方式、优缺点,以及 Android 源码中的使用实例,配以图解与注释。
单例模式的核心目标是:
- 唯一性:确保类只有一个实例。
- 全局访问:提供对该实例的全局访问。
UML 类图
以下是单例模式的 UML 类图:
Singleton - static instance: Singleton - instance -Singleton() +getInstance() -Singleton() +getInstance()
-
表示私有成员。+
表示公共方法。
单例模式的实现方式
1. 饿汉式 (Eager Initialization)
实现
饿汉式在类加载时即创建实例,线程安全,但可能造成内存浪费。
java
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)
实现
懒汉式在首次调用时创建实例,但需要处理线程安全问题。
java
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)
实现
双重检查锁定优化了懒汉式的性能,适合多线程环境。
java
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)
实现
静态内部类方式结合了饿汉式和懒汉式的优点,线程安全且支持延迟加载。
java
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)
实现
枚举单例是实现单例模式的推荐方式,简洁且天然线程安全。
java
public enum Singleton {
INSTANCE;
public void doSomething() {
// 业务逻辑
}
}
图解
App Singleton 调用 INSTANCE 返回实例 App Singleton
优缺点
优点 | 缺点 |
---|---|
简洁、线程安全、防止反序列化破坏 | 不支持懒加载 |
Android 源码中的单例模式
1. Application 类
Application
类在整个应用运行期间只有一个实例,属于全局单例。
java
Application app = context.getApplicationContext();
2. SharedPreferences
SharedPreferences
在内部使用单例模式管理实例。
java
SharedPreferences prefs = context.getSharedPreferences("prefs", Context.MODE_PRIVATE);
3. OkHttpClient
OkHttp 的 OkHttpClient
通常通过单例模式管理网络请求客户端。
java
OkHttpClient client = OkHttpClientSingleton.getInstance();
结论
单例模式是一种简单却强大的设计模式,适用于需要全局唯一实例的场景。在 Android 开发中,正确使用单例模式可以提升代码的可维护性与性能,但需注意线程安全问题。
通过理解其不同实现方式及优缺点,开发者可以根据实际需求选择合适的单例实现方法。