设计模式:单例模式 ③

一、思想

单例模式主要是为了避免因为创建了多个实例造成资源的浪费,使用单例模式能够保证整个应用中有且只有一个实例。

定义:只需要三步就可以保证对象的唯一性

(1) 不允许其他程序用new对象

(2) 在该类中创建对象

(3) 对外提供一个可以让其他程序获取该对象的方法

对比定义:

(1) 私有化该类的构造函数

(2) 通过new在本类中创建一个本类对象

(3) 定义一个公有的方法,将在该类中所创建的对象返回

例子:

双重检验锁单例模式是一种线程安全的单例模式实现方式,

它通过使用synchronized关键字来确保线程安全性。

具体实现方式是在getInstance()方法中添加双重检验锁,这可以避免不必要的锁竞争和实例化。

复制代码
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;
    }
}

二、应用场景

单例模式通常在需要确保全局只有一个实例的场景中使用,例如:

  • 线程池:在多线程环境下,线程池需要保证只有一个实例。
  • 数据库连接池:同样地,数据库连接池也需要保证只有一个实例。
  • 日志对象:日志对象通常是全局可见的,因此需要保证只有一个实例。
  • 配置文件:在某些情况下,需要全局共享的配置文件也需要保证只有一个实例。

三、总结

单例模式是一种非常常用的设计模式,在多线程环境下,它可以确保只有一个实例被创建,并提供一种全局访问这个实例的方式。在Java中,可以通过私有构造函数和静态方法实现单例模式。在实现单例模式时,需要注意线程安全性、序列化问题以及反射问题。尽管单例模式非常有用,但也有一些缺点,例如它可能导致代码变得更加复杂,而且在多线程环境下可能会影响性能。因此,在使用单例模式时需要根据具体情况进行权衡。

相关推荐
geovindu14 小时前
rust: Abstract Factory pattern
开发语言·后端·设计模式·rust·抽象工厂模式
Carl_奕然1 天前
【智能体】Loop 的四种设计模式之:Event-Driven Loop(2026 最新版)
人工智能·驱动开发·python·设计模式
Carl_奕然1 天前
【智能体】Loop 的四种设计模式之:Hill Climbing Loop(2026 最新版)
人工智能·python·设计模式
晚安code2 天前
设计模式入门:吃透 SOLID 原则与迪米特法则,再学 5 个高频模式
后端·设计模式
染指11102 天前
135.Agent-多Agent框架-LangChain多智能体(SubAgents子代理)
数据库·人工智能·设计模式·langchain·agent·agents
路弥行至3 天前
【Head First 设计模式】第 2 章:观察者模式 —— 用现代 C++ 重新解读“交互对象的松耦合
c++·经验分享·笔记·观察者模式·设计模式·入门教程·headfirst
YYYing.3 天前
【设计模式系列 (九) 】装饰器模式
c++·后端·设计模式·装饰器模式·c/c++
沫璃染墨3 天前
《从零入门Linux系统篇(五十六):线程篇·九——生产者消费者模型:从条件变量到BlockingQueue实现》
linux·服务器·c++·驱动开发·设计模式·架构·系统架构
c萱4 天前
AI产品经理——01基础认知篇
设计模式·prompt·aigc·产品经理·ai编程·gitcode·ai-native
YYYing.4 天前
【设计模式系列 (八) 】组合模式
c++·后端·设计模式·组合模式·c/c++