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

设计模式—2—单例模式

文章目录

    • 一、单例模式概述
    • 二、单例模式特点
    • 三、示例
      • 3.1、基本实现(懒汉式-线程不安全)
      • 3.2、基本实现(懒汉式-线程安全)
      • 3.3、基本实现(饿汉式)
    • 四、总结

一、单例模式概述

单例模式(Singleton Pattern)是一种常用的软件设计模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。这种模式可以避免多个实例的产生,有助于节省系统资源,并保证在整个应用中该类的方法和状态的一致性。

二、单例模式特点

  • 私有构造函数:为了防止其他对象实例化该类,单例类的构造函数通常被声明为私有的。
  • 静态内部实例:单例类内部包含一个静态的成员变量,用于存储唯一实例。
  • 公共获取方法:单例类提供一个静态方法来安全地返回实例。这个方法通常会处理线程安全延迟初始化等问题。
  • 线程安全性:在多线程环境下,需要确保单例模式是线程安全的,即无论多少线程同时访问,都只能创建一个实例。
  • 延时初始化:就是这个单例对象什么时候被初始化,提前初始化(饿汉式),第一次被调用时初始化(懒汉式)。

三、示例

3.1、基本实现(懒汉式-线程不安全)

public class Singleton {
    private static Singleton instance;
    // 私有构造函数
    private Singleton() {}
    // 公共静态方法,线程不安全
    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

3.2、基本实现(懒汉式-线程安全)

public class Singleton {
    private volatile static Singleton instance;
    private Singleton() {}
    // 双重检查锁定
    public static Singleton getInstance() {
    	// 第一次:判空
        if (instance == null) {
        	// 第二次:创建时加锁,保证线程安全
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

3.3、基本实现(饿汉式)

public class Singleton {
    // 构建的时候就初始化
    private static Singleton instance = new Singleton();
    private Singleton() {}
    public static Singleton getInstance() {
        return instance;
    }
}

四、总结

单例模式在实际开发中非常常见,尤其是在管理配置文件、日志对象、数据库连接等方面。不过需要注意的是,单例模式也有其局限性,比如过度使用会导致代码变得难以测试和维护。因此,在使用时需要权衡利弊。


http://www.kler.cn/a/291844.html

相关文章:

  • CH340系列芯片驱动电路·CH340系列芯片驱动!!!
  • 【进程篇】操作系统
  • 面试题整理9----谈谈对k8s的理解2
  • web3跨链桥协议-Nomad
  • Dhatim FastExcel 读写 Excel 文件
  • 一个开源的自托管虚拟浏览器项目,支持在安全、私密的环境中使用浏览器
  • 【C++ 第二十章】模拟实现 shared_ptr(可以拷贝的智能指针)
  • 【Ubuntu20.04】配置深度学习环境
  • 机器学习周报(8.26-9.1)
  • 【C++ Primer Plus习题】9.3
  • C# 删除Word文档中的段落
  • Golang 内存泄漏详解:原因、检测与修复
  • 【论文阅读】LLM4CP: Adapting Large Language Models for Channel Prediction(2024)
  • 啄木鸟上门安装维修系统源码开发
  • 【个人笔记】VCS工具与命令
  • 钢铁百科:Q420DR力学性能、Q420DR执行标准、Q420DR低温容器钢板
  • 自己设计的QT系统,留个档
  • Docker 容器编排之 Docker Compose
  • Arcgis将图层转shape文件
  • 【大数据】DataX深度解析:数据同步的神器是如何工作的?
  • Android Gradle 插件的说明
  • AI生成图片,ChatGPT生成路虎女逆行打人插图。
  • 语音测试(一)ffmpeg视频转音频
  • 【2024高教社杯全国大学生数学建模竞赛】B题 生产过程中的决策问题——解题思路 代码 论文
  • 浅谈C# 虚函数
  • halcon+c#+abb机器人=激光熔覆视觉工作站