首页 > 编程语言 >Java设计模式之单例模式。

Java设计模式之单例模式。

时间:2024-03-17 10:30:32浏览次数:12  
标签:Singleton Java private class instance static 单例 设计模式 public

在Java中,单例模式是一种常见的设计模式,用于确保一个类只有一个实例,并提供全局访问点下面介绍七种常见的单例模式实现方式以及它们的优缺点。

1. 懒汉式(线程不安全)

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

优点:简单易实现。

缺点:多线程环境下可能会创建多个实例

2. 懒汉式(线程安全,加锁)

public class Singleton {
    private static Singleton instance;

    private Singleton() {}

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

优点:线程安全。

缺点:加锁会影响性能。

3. 饿汉式

public class Singleton {
    private static Singleton instance = new Singleton();

    private Singleton() {}

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

优点:线程安全,不需要加锁。

缺点:类加载时即创建实例,可能造成资源浪费

4. 双重检查锁

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;
    }
}

优点:延迟加载,线程安全

缺点:实现复杂。

5. 静态内部类

public class Singleton {
    private Singleton() {}

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

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

优点:延迟加载,线程安全

缺点:实现稍复杂。

6. 枚举单例

public enum Singleton {
    INSTANCE;

    public void doSomething() {
        // Do something
    }
}

优点:简单、线程安全、防止反射和序列化攻击

缺点:无法延迟加载。

7. 使用容器实现单例

public class SingletonManager {
    private static Map<String, Object> objectMap = new HashMap<>();

    private SingletonManager() {}

    public static void registerService(String key, Object instance) {
        if (!objectMap.containsKey(key)) {
            objectMap.put(key, instance);
        }
    }

    public static Object getService(String key) {
        return objectMap.get(key);
    }
}

优点:可以管理多个单例对象。

缺点:需要手动管理对象的注册和获取

标签:Singleton,Java,private,class,instance,static,单例,设计模式,public
From: https://blog.csdn.net/2401_82884096/article/details/136593883

相关文章

  • Java设计模式之工厂模式。
    工厂模式(FactoryPattern)是Java中最常用的设计模式之一,是一种创建型设计模式,用于创建对象而不暴露创建逻辑。工厂模式包括工厂方法模式和抽象工厂模式,下面结合代码看看它的使用用法吧。//产品接口interfaceProduct{voidproduce();}//具体产品类classCon......
  • 代码随想录算法训练营第十天(栈和队列I)| 232. 用栈实现队列、225. 用队列实现栈(JAVA)
    文章目录栈和队列理论基础概念方法栈队列232.用栈实现队列解题思路源码225.用队列实现栈解题思路源码总结栈和队列理论基础概念栈:后进先出队列:先进先出方法栈方法名作用Stackstack=newStack<>();构造栈stack.push(Ee)将e入栈,并返回estack.pop()将栈......
  • JAVA实现大文件分片上传断点续传
    直接上代码importorg.springframework.web.multipart.MultipartFile;importjava.util.concurrent.CompletableFuture;importorg.apache.commons.lang3.StringUtils;importlombok.extern.slf4j.Slf4j;importjava.text.DecimalFormat;importjava.io.*;@Slf4jpublic......
  • 智能酒店管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图 项目介绍随着科技的进步和旅游业的繁荣,酒店行业正面临着前所未有的机遇与挑战。为了提高服务质量、运营效率以及顾客满意度,智能酒店管理系统应运而生。这种系统利用......
  • 灾情信息管理系统(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图 项目介绍随着自然灾害频发,及时有效的灾情信息管理对于灾害应对和救援工作至关重要。一个专业的灾情信息管理系统能够帮助政府和救援组织快速收集、处理和分析灾区数......
  • java设计模式
    单例设计模式java实现(一)单例设计模式​单例设计模式(SingletonPattern)确保某个类中只有一个实例,而且这个类是不能被实例化的,也就是不能用new关键字来创建对象,该类提供了公共静态的方法,用于返回该类对象,不需要自行实例化。而单例模式有分为饿汉式,以及懒汉式。特点一......
  • 智慧教室预约(JSP+java+springmvc+mysql+MyBatis)
    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。项目文件图 项目介绍随着教育数字化转型的深入,智慧教室成为提升教学质量和效率的重要环境。智慧教室预约系统能够有效管理教学资源,实现教室使用的优化配置,确保设备高效利用。它......
  • Java映射(含源码)
    在Java中,“映射”(Map)是一个存储键值对的数据结构,允许你通过键(Key)快速访问值(Value)。映射中的每个键都是唯一的,这意味着每个键都对应一个特定的值。Java提供了几种实现映射接口的类,其中最常用的是HashMap、TreeMap和LinkedHashMap。下面是这些实现的简要介绍和它们之间的区别,......
  • Java中的synchronized
    概述Java的锁可以分为乐观锁和悲观锁两类。而synchronized是悲观锁的代表。本文想要说明一下两个问题:synchronized锁的是哪个对象publicvoidmethod(){ synchronized(this){ ... }}publicsynchronizedvoidmethod(){ ...}    上述两种方式,synchronize......
  • JavaScript学习 第三天
    一、数组(一)数组基本知识声明按顺序保存数据的数据类型<body><script>letarr=[1,2,'猪儿',true]</script></body>声明数组函数<body><script>letarr=newArray(1,2,'猪儿',true)</script></body>......