第26篇:Java 简单实现单例设计模式(饿汉式和懒汉式)

简介: 📖 ① 构造方法私有化(不让别人有创建该类实例的权利)📖 ② 在类的内部创建该类的唯一对象(该类实例只能有一个,且在该类中由自己创建)📖 ③ 向外暴露一个公共的静态方法(以返回该类的唯一对象)(通过public static 静态方法向外界返回唯一的该类的对象)

一、概念

✏️【Singleton Pattern】如果一个类被设计成单例设计模式,则在整个应用程序运行过程中,该类只能存在一个实例。

二、饿汉式

思考:如何实现在整个应用程序运行过程中,某个类只能存在一个实例:

public class HungrySingleton {
    // static: 保证 HungrySingleton 的实例只占用一份内存
    private static HungrySingleton instance = new HungrySingleton();

    // 1.构造方法私有化
    private HungrySingleton() {

    }

    // 2.提供公共的静态方法返回该类的唯一实例
    public static HungrySingleton getInstance() {
        return instance;
    } 
}
📖 ① 构造方法私有化( 不让别人有创建该类实例的权利
📖 ② 在类的内部创建该类的唯一对象( 该类实例只能有一个,且在该类中由自己创建
📖 ③ 向外暴露一个公共的静态方法(以返回该类的唯一对象)( 通过public static 静态方法向外界返回唯一的该类的对象

❓ 为什么是饿汉式呢?
📗 HungrySingleton 的唯一对象在类中被直接创建(new),并且被定义为类变量
📗 当 HungrySingleton 类被加载的时候,HungrySingleton 的唯一对象就会在堆空间存在
📗 假如 HungrySingleton 中存在其他类变量或类方法。我只是想使用一下里面的哪些类变量和类方法,并不想获得它的唯一实例。但是,只要我使用了 HungrySingleton 里面的其他静态方法或类变量就会导致 HungrySingleton 的唯一对象在堆空间产生(因为 HungrySingleton 的唯一对象实例也是类变量)
📗 很饥渴,饿汉式
📗 可能导致内存浪费

Java 中的 Runtime 类是饿汉式单例设计模式
在这里插入图片描述


public class HungrySingleton {
    public static int one = 1;

    private static HungrySingleton instance = new HungrySingleton();

    private HungrySingleton() {
        System.out.println("private HungrySingleton()");
    }

    public static HungrySingleton getInstance() {
        return instance;
    }
}
public class Whatever {
    public static void main(String[] args) {
        // private HungrySingleton()
        // 1
        System.out.println(HungrySingleton.one);
    }
}
📗 在上面的代码中,博主仅仅是使用一下 HungrySingleton 类中的公共静态变量 one,博主并不想获得该类的唯一实例
📗 但是 HungrySingleton 的构造方法依然被调用了
📗 类被加载的时候,类中的类变量会被初始化
📗 private static HungrySingleton instance 类变量的初始化会创建 HungrySingleton 的唯一对象

三、懒汉式

public class LazySingleton {
    private static LazySingleton instance = null;

    private LazySingleton() {

    }

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

        return instance;
    }
}
public class Whatever {
    public static void main(String[] args) {
        LazySingleton instance1 = LazySingleton.getInstance();
        LazySingleton instance2 = LazySingleton.getInstance();
        LazySingleton instance3 = LazySingleton.getInstance();
        System.out.println(instance1);
        System.out.println(instance2);
        System.out.println(instance3);
        
        /*
            com.gq.LazySingleton@1540e19d
            com.gq.LazySingleton@1540e19d
            com.gq.LazySingleton@1540e19d
         */
    }
}
📗 懒汉式:类加载不会导致该类对象的创建
📗 只有调用 getInstance 方法的时候才有可能创建该类的对象【懒创建】
📗 可能有线程安全问题

如有错误,请不吝赐教!

相关文章
|
2月前
|
设计模式 存储 安全
设计模式——设计模式介绍和单例设计模式
饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全,同步方法)、懒汉式(线程不安全,同步代码块)、双重检查(推荐,线程安全、懒加载)、静态内部类(推荐)、枚举(推荐)
设计模式——设计模式介绍和单例设计模式
|
1月前
|
设计模式 SQL 安全
【编程进阶知识】Java单例模式深度解析:饿汉式与懒汉式实现技巧
本文深入解析了Java单例模式中的饿汉式和懒汉式实现方法,包括它们的特点、实现代码和适用场景。通过静态常量、枚举类、静态代码块等方式实现饿汉式,通过非线程安全、同步方法、同步代码块、双重检查锁定和静态内部类等方式实现懒汉式。文章还对比了各种实现方式的优缺点,帮助读者在实际项目中做出更好的设计决策。
42 0
|
3月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
54 1
|
3月前
|
设计模式 人工智能 Java
Java 如何使用单例类
Java 如何使用单例类
16 1
|
3月前
|
设计模式 Java
【Java】单例设计模式
【Java】单例设计模式
|
4月前
|
设计模式 存储 安全
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
Java面试题:设计一个线程安全的单例类并解释其内存占用情况?使用Java多线程工具类实现一个高效的线程池,并解释其背后的原理。结合观察者模式与Java并发框架,设计一个可扩展的事件处理系统
62 1
|
3月前
|
设计模式 SQL 安全
单例模式大全:细说七种线程安全的Java单例实现,及数种打破单例的手段!
设计模式,这是编程中的灵魂,用好不同的设计模式,能使你的代码更优雅/健壮、维护性更强、灵活性更高,而众多设计模式中最出名、最广为人知的就是Singleton Pattern单例模式。通过单例模式,我们就可以避免由于多个实例的创建和销毁带来的额外开销,本文就来一起聊聊单例模式。
|
4月前
|
设计模式 安全 NoSQL
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
Java面试题:结合单例模式与Java内存管理,设计一个线程安全的单例类?分析Java多线程工具类ExecutorService与Java并发工具包中的工具类,设计一个Java并发框架的分布式锁实现
64 0
|
20天前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
2月前
|
设计模式 数据库连接 PHP
PHP中的设计模式:提升代码的可维护性与扩展性在软件开发过程中,设计模式是开发者们经常用到的工具之一。它们提供了经过验证的解决方案,可以帮助我们解决常见的软件设计问题。本文将介绍PHP中常用的设计模式,以及如何利用这些模式来提高代码的可维护性和扩展性。我们将从基础的设计模式入手,逐步深入到更复杂的应用场景。通过实际案例分析,读者可以更好地理解如何在PHP开发中应用这些设计模式,从而写出更加高效、灵活和易于维护的代码。
本文探讨了PHP中常用的设计模式及其在实际项目中的应用。内容涵盖设计模式的基本概念、分类和具体使用场景,重点介绍了单例模式、工厂模式和观察者模式等常见模式。通过具体的代码示例,展示了如何在PHP项目中有效利用设计模式来提升代码的可维护性和扩展性。文章还讨论了设计模式的选择原则和注意事项,帮助开发者在不同情境下做出最佳决策。

热门文章

最新文章

  • 1
    C++一分钟之-设计模式:工厂模式与抽象工厂
    43
  • 2
    《手把手教你》系列基础篇(九十四)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-下篇(详解教程)
    50
  • 3
    C++一分钟之-C++中的设计模式:单例模式
    58
  • 4
    《手把手教你》系列基础篇(九十三)-java+ selenium自动化测试-框架设计基础-POM设计模式实现-上篇(详解教程)
    38
  • 5
    《手把手教你》系列基础篇(九十二)-java+ selenium自动化测试-框架设计基础-POM设计模式简介(详解教程)
    63
  • 6
    Java面试题:结合设计模式与并发工具包实现高效缓存;多线程与内存管理优化实践;并发框架与设计模式在复杂系统中的应用
    59
  • 7
    Java面试题:设计模式在并发编程中的创新应用,Java内存管理与多线程工具类的综合应用,Java并发工具包与并发框架的创新应用
    42
  • 8
    Java面试题:如何使用设计模式优化多线程环境下的资源管理?Java内存模型与并发工具类的协同工作,描述ForkJoinPool的工作机制,并解释其在并行计算中的优势。如何根据任务特性调整线程池参数
    50
  • 9
    Java面试题:请列举三种常用的设计模式,并分别给出在Java中的应用场景?请分析Java内存管理中的主要问题,并提出相应的优化策略?请简述Java多线程编程中的常见问题,并给出解决方案
    112
  • 10
    Java面试题:设计模式如单例模式、工厂模式、观察者模式等在多线程环境下线程安全问题,Java内存模型定义了线程如何与内存交互,包括原子性、可见性、有序性,并发框架提供了更高层次的并发任务处理能力
    78