单例模式详解

单例模式(Singleton Pattern)是一种创建型设计模式,其核心目的是确保一个类只有一个实例,并提供一个全局访问点。以下是单例模式的详解:

定义

单例模式确保一个类只有一个实例,并提供一个全局访问点。这个实例被所有需要它的部分共享。

结构

单例模式通常包含以下几个部分:

  1. 私有构造函数:确保外部代码不能通过new关键字创建类的实例。

  2. 私有静态变量:保存类的唯一实例。

  3. 公有静态方法:提供一个全局访问点,返回类的唯一实例。

实现方式

单例模式有几种不同的实现方式,包括懒汉式、饿汉式、双重检查锁定(Double-Checked Locking)和静态内部类等。

  1. 饿汉式(Eager Initialization)

在类加载时就创建实例,线程安全,但不是按需初始化。

public class Singleton {

private static final Singleton INSTANCE = new Singleton();

private Singleton() {

}

public static Singleton getInstance() {

return INSTANCE;

}

}

  1. 懒汉式(Lazy Initialization)

按需创建实例,但需要处理线程安全问题。

public class Singleton {

private static Singleton instance;

private Singleton() {

}

public static synchronized Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

  1. 双重检查锁定(Double-Checked 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;

}

}

  1. 静态内部类(Static Nested 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;

}

}

优点

  1. 控制实例数量:确保一个类只有一个实例。

  2. 资源节约:特别是在创建实例需要消耗大量资源时。

  3. 全局访问点:提供全局访问点,方便访问实例。

缺点

  1. 全局状态:单例持有的应用状态可能会导致测试困难和代码间的耦合。

  2. 扩展困难:单例模式在某种程度上违反了开闭原则,扩展时需要修改实例化代码。

  3. 线程安全问题:在多线程环境下需要额外处理线程安全问题。

应用场景

  1. 配置管理器:配置信息全局访问,如数据库连接信息。

  2. 连接池:数据库连接池通常设计为单例模式。

  3. 日志记录器:全局日志记录器实例。

单例模式是一种简单但强大的设计模式,适用于需要严格控制实例数量的场景。

相关推荐
码匠许师傅11 小时前
【设计模式精讲】7.建造者模式(Builder)
设计模式·建造者模式
码匠许师傅11 小时前
【设计模式精讲】6.抽象工厂(Abstract Factory)
c++·设计模式
workflower1 天前
人形机器人灵巧手产业链
人工智能·设计模式·机器人·云计算·无人机
Java后端的Ai之路1 天前
03、Python - 抽象工厂模式
开发语言·python·设计模式·抽象工厂模式·通用智慧
AI人工智能+电脑小能手1 天前
大白话说Java设计模式-45-解释器模式(源码剖析篇)
java·设计模式·解释器模式·源码分析·pattern·spel·javacc
码匠许师傅2 天前
【设计模式精讲】4.单例模式(Singleton)
c++·单例模式·设计模式
雾削木2 天前
2026 编程领域热点知识速览:AI 辅助开发、设计模式实战与嵌入式高效迭代
人工智能·设计模式
AI人工智能+电脑小能手2 天前
大白话说Java设计模式-42-访问者模式(业务实战篇)
java·spring·设计模式·访问者模式·asm·营销规则·数据结构与操作分离
AI人工智能+电脑小能手3 天前
大白话说Java设计模式-43-访问者模式(源码剖析篇)
java·设计模式·访问者模式·源码分析·elementvisitor·asm classvisitor·spring spel
Michael_lcf3 天前
Agent设计模式:思考-行动-观察循环的本质与局限
设计模式·agent设计模式·agent设计模式的本质