当前位置: 首页 > article >正文

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

什么是单例模式

单例模式 (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.kler.cn/a/449265.html

相关文章:

  • 编译原理复习---正则表达式+有穷自动机
  • Windows、CentOS环境下搭建自己的版本管理资料库:GitBlit
  • LeetCode:1387. 将整数按权重排序(记忆化搜索 Java)
  • Postman接口测试工具使用详解
  • Retrofit源码分析:动态代理获取Api接口实例,解析注解生成request,线程切换
  • ECharts关系图-关系图11,附视频讲解与代码下载
  • 如何注册和使用Facebook企业号
  • uniapp验证码
  • 数据库管理-第274期 Oracle Enterprise Manager 24ai新特性一览(20241223)
  • 使用frp进行内网穿透
  • 程控电阻箱应用中需要注意哪些安全事项?
  • Log4j简介
  • 在Excel中绘制ActiveX控件:解决文本编辑框定位问题
  • ubuntu装P104
  • 操作系统(22)外存的组织方式
  • 初识Go语言
  • docker部署微信小程序自动构建发布和更新
  • “电找车“ | 助力移动充电机器人快速落地
  • Could not resolve host: github.com
  • Vue零基础教程|从前端框架到GIS开发系列课程(七)响应式系统介绍
  • 【氮化镓】p沟道GaN-on-Si晶体管的衬底偏置效应
  • 【习题答案】构建灵活高效的消息推送能力
  • c++---------流类
  • R机器学习:决策树算法的理解与实操
  • 【java设计模式】1 - 软件设计原则
  • springboot471基于协同过滤算法商品推荐系统(论文+源码)_kaic