设计模式之单例模式

一、单例模式

1、定义

  • 单例模式是一种创建型设计模式,它保证一个类只有一个实例,并提供一个全局访问点。

  • 在单例模式中,类的构造函数被私有化,使得类不能直接被实例化。通过类的静态方法或者静态变量来实现对唯一实例的访问。

2、单例模式的主要特点包括:

  • 类只有一个实例,该实例由类自身创建,并在整个生命周期内保持不变。
  • 要访问该实例,必须使用单例类的静态方法或变量,避免直接实例化。

3、单例模式的应用场景包括:

  • 需要确保某个类只有一个实例,并且在程序的运行过程中该实例需要被频繁访问。
  • 需要全局访问某个资源,例如线程池、数据库连接等。I/O与数据库的连接。Windows里面的Task Manager(任务管理器)也是单例模式。

4、单例模式的优点包括:

  1. 提供全局唯一的访问点,方便其他类来访问该实例;
  2. 避免了重复创建实例的开销,提高了性能。

二、代码实现

1、以下是几种常见的单例模式实现案例:

  • 饿汉式单例模式:
java 复制代码
public class Singleton {
    private static final Singleton instance = new Singleton();

    private Singleton() {} 

    public static Singleton getInstance() {
        return instance;
    }
}

在该实现中,Singleton类的实例在类加载时就已经被创建,因此被称为饿汉式。通过getInstance()方法获取实例;没有线程安全的问题,浪费内存空间。

  • 懒汉式单例模式:
java 复制代码
public class Singleton {
    private static Singleton instance;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

在该实现中,Singleton类的实例是在第一次调用getInstance()方法时创建的,因此被称为懒汉式。通过getInstance()方法获取实例。

  • 双重检查锁单例模式:
java 复制代码
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;
    }
}

在该实现中,通过双重检查锁的方式实现懒汉式单例模式。使用volatile关键字保证instance的可见性。保证了线程安全,又比直接上锁提高了执行效率,还节省了内存空间。

  • 静态内部类单例模式:
java 复制代码
public class Singleton {
    private Singleton() {}

    private static class SingletonHolder {
        private static final Singleton instance = new Singleton();
    }

    public static Singleton getInstance() {
        return SingletonHolder.instance;
    }
}

在该实现中,通过静态内部类的方式实现单例模式。在SingletonHolder内部类中创建实例,并通过getInstance()方法获取实例。

  • 枚举
java 复制代码
public enum Singleton {

    INSTANCE;
    public Singleton getInstance(){
        return INSTANCE;
    }
}

以上是几种常见的单例模式实现案例。每种实现方式都有各自的优劣势,具体选择哪种方式取决于实际需求。

如有不足,欢迎指出,共同进步---------------------------

相关推荐
越甲八千19 分钟前
重温设计模式--享元模式
设计模式·享元模式
码农爱java2 小时前
设计模式--抽象工厂模式【创建型模式】
java·设计模式·面试·抽象工厂模式·原理·23种设计模式·java 设计模式
越甲八千2 小时前
重温设计模式--中介者模式
windows·设计模式·中介者模式
犬余3 小时前
设计模式之桥接模式:抽象与实现之间的分离艺术
笔记·学习·设计模式·桥接模式
Theodore_10224 小时前
1 软件工程——概述
java·开发语言·算法·设计模式·java-ee·软件工程·个人开发
越甲八千5 小时前
重拾设计模式--组合模式
设计模式·组合模式
思忖小下8 小时前
梳理你的思路(从OOP到架构设计)_设计模式Composite模式
设计模式·组合模式·eit
机器视觉知识推荐、就业指导8 小时前
C++设计模式:组合模式(公司架构案例)
c++·后端·设计模式·组合模式
越甲八千8 小时前
重拾设计模式--工厂模式(简单、工厂、抽象)
c++·设计模式
重生之绝世牛码10 小时前
Java设计模式 —— 【结构型模式】外观模式详解
java·大数据·开发语言·设计模式·设计原则·外观模式