首页 > 其他分享 >单列模式

单列模式

时间:2024-09-17 15:04:22浏览次数:8  
标签:Singleton 单列 模式 instance static private 线程 public

单列模式

“单例模式(Singleton Pattern),用于确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。这个模式在需要控制资源的访问或者确保某些操作只有一个实例时使用。

单例模式的特点

  1. 唯一性:保证一个类只有一个实例。
  2. 全局访问:提供一个全局的访问点来获取这个实例。
  3. 延迟初始化:可以在第一次需要时才创建实例(懒汉式),或在程序启动时就创建实例(饿汉式)。

实现方式

饿汉式

  • 在类加载时就创建实例。
  • 线程安全,但可能在不需要时就创建了实例。
public class Singleton {
    private static final Singleton instance = new Singleton();
    
    private Singleton() {}
    
    public static Singleton getInstance() {
        return instance;
    }
}

懒汉式

  • 在第一次使用时才创建实例。
  • 需要注意线程安全问题。
public class Singleton {
    private static Singleton instance;
    
    private Singleton() {}
    
    public static  Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();
        }
        return instance;
    }
}

静态内部类

  • 结合了懒汉式和饿汉式的优点。在 Java 中被认为是一种优雅且高效的单例实现方式,因为它利用了 Java 的类加载机制和静态内部类的特性来实现延迟初始化和线程安全。

    public class Singleton {
        private Singleton() {
        }
        public static Singleton getInstance() {
            return holder.INSTANCE;
        }
        private static class holder{
            private final static Singleton INSTANCE = new Singleton();
        }
    }
    
    

双重检查锁(DCL)

  • 在懒汉式基础上优化,提高性能和线程安全。
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推荐的单例实现方式,简单且线程安全。
public enum Singleton {
    INSTANCE;
}	

测试代码

import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;
//单列模式
public class TestSingleton {

    // 使用线程安全的 Set 来存储实例的哈希码
    private static final Set<Integer> hashCodes = new CopyOnWriteArraySet<>();
    public static void main(String[] args) {
        // 创建一个线程数组
        Thread[] threads = new Thread[100];

        // 启动多个线程来测试 CreativeMode.SingletonPattern.DoubleLocking.Singleton
        for (int i = 0; i < threads.length; i++) {
            threads[i] = new Thread(() -> {

                Singleton instance = Singleton.getInstance();
//                Singleton instance = Singleton.INSTANCE; //枚举使用这个
                hashCodes.add(instance.hashCode()); // 添加实例的哈希码到线程安全的集合
            });
            threads[i].start();
        }

        // 等待所有线程完成
        for (Thread thread : threads) {
            try {
                thread.join();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }

        // 打印去重后的哈希码
        System.out.println("-------------------------");
        for (Integer hashCode : hashCodes) {
            System.out.println(hashCode);
        }
    }
}

使用场景

  • 配置管理(如数据库连接池、日志管理等)。
  • 控制对资源的访问(如打印机驱动)。
  • 确保类的唯一性(如配置类)。

单例模式有助于减少系统中的冗余实例,节省资源,同时保持全局状态的一致性。

标签:Singleton,单列,模式,instance,static,private,线程,public
From: https://www.cnblogs.com/20lxj666/p/18384616

相关文章

  • 23种设计模式
    23种设计模式设计模式是软件工程中用于解决特定问题的通用解决方案。常见的设计模式有24种,通常分为三大类:创建型、结构型和行为型。下面是对这24种设计模式的详细解释及其归类:1.创建型模式1.1单例模式(Singleton)目的:确保一个类只有一个实例,并提供一个全局访问点。适用场......
  • 适配器模式
    适配器模式适配器模式(AdapterPattern)是一种结构型设计模式,用于解决接口不兼容的问题。它的主要作用是将一个类的接口转换成客户端期望的另一个接口,使得原本由于接口不兼容而无法一起工作的类可以一起工作。概念目标接口(Target):客户端期望使用的接口。源接口(Adaptee):需要被......
  • 原型模式
    原型模式原型模式(PrototypePattern)是一种创建型设计模式,其主要目的是通过复制现有的对象来创建新的对象,而不是通过构造函数进行实例化。这个模式的核心思想是“克隆”现有对象,以获得新的实例,尤其是在创建成本较高的情况下非常有用。原型模式通常涉及以下几个角色:原型(Prototyp......
  • 建造者模式
    建造者模式建造者模式(BuilderPattern)是一种创建型设计模式,它用于分步骤地创建复杂对象,而无需直接调用构造函数。通过将对象的构建过程与其表示(即对象内部细节的实现)分离,建造者模式允许创建不同的对象表示,同时保持构造过程的一致性。特点分步骤创建:建造者模式将对象的创建过程......
  • 抽象工厂模式
    抽象工厂模式抽象工厂模式(AbstractFactoryPattern)是一种创建型设计模式,它提供一个接口,用于创建一系列相关或互相依赖的对象,而无需指定它们的具体类。抽象工厂模式常用于需要创建一组相关或依赖对象的场景,确保这些对象在不同的环境中可以协同工作。特点抽象工厂:定义了一组创......
  • 享元模式
    享元模式(FlyweightPattern)是一种结构型设计模式,旨在通过共享大量细粒度对象来减少内存使用。它在需要创建大量相似对象的场景中尤其有用,通过共享对象来降低内存开销,从而提高性能。核心思想享元模式将对象的状态分为两部分:内部状态(IntrinsicState):不随外部环境改变,可以共享的......
  • 外观模式
    外观模式外观模式(FacadePattern)是一种结构型设计模式,旨在为复杂的子系统提供一个简单的接口。它的核心思想是将系统的复杂性封装在一个统一的接口中,使得外部代码可以通过这个接口简化对复杂系统的操作。主要组成部分外观类(FacadeClass):提供一个简化的接口来访问复杂的子系统......
  • 装饰者模式
    装饰者模式装饰者模式(DecoratorPattern)是一种结构型设计模式,主要用于动态地给对象添加额外的功能,而不改变其结构。这个模式通过创建一个装饰类来包装原始对象,从而扩展其功能。主要角色组件(Component):定义一个接口或抽象类,声明可以被装饰的对象所共有的接口。具体组件(Concrete......
  • 组合模式
    组合模式组合模式(CompositePattern)是一种结构型设计模式,用于将对象组合成树形结构以表示“部分-整体”的层次关系。它允许客户端以统一的方式处理单个对象和对象集合,使得客户端不需要区分具体的对象类型,从而简化了代码的处理逻辑。主要组成部分Component(组件):定义了叶子对象和......
  • 桥接模式
    桥接模式桥接模式(BridgePattern)是一种结构型设计模式,它通过将抽象部分与实现部分分离,从而使它们可以独立地变化。这个模式的主要目的是解耦抽象和实现,使得它们可以独立地变化和扩展。主要概念抽象(Abstraction):这是一个接口或抽象类,它定义了高层次的操作。修正抽象(RefinedA......