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

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

一、概念

✏️【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 方法的时候才有可能创建该类的对象【懒创建】

📗 可能有线程安全问题

如有错误,请不吝赐教!

相关文章
|
22天前
|
设计模式 Java 程序员
[Java]23种设计模式
本文介绍了设计模式的概念及其七大原则,强调了设计模式在提高代码重用性、可读性、可扩展性和可靠性方面的作用。文章还简要概述了23种设计模式,并提供了进一步学习的资源链接。
36 0
[Java]23种设计模式
|
6天前
|
设计模式 JavaScript Java
Java设计模式:建造者模式详解
建造者模式是一种创建型设计模式,通过将复杂对象的构建过程与表示分离,使得相同的构建过程可以创建不同的表示。本文详细介绍了建造者模式的原理、背景、应用场景及实际Demo,帮助读者更好地理解和应用这一模式。
|
1月前
|
设计模式 监控 算法
Java设计模式梳理:行为型模式(策略,观察者等)
本文详细介绍了Java设计模式中的行为型模式,包括策略模式、观察者模式、责任链模式、模板方法模式和状态模式。通过具体示例代码,深入浅出地讲解了每种模式的应用场景与实现方式。例如,策略模式通过定义一系列算法让客户端在运行时选择所需算法;观察者模式则让多个观察者对象同时监听某一个主题对象,实现松耦合的消息传递机制。此外,还探讨了这些模式与实际开发中的联系,帮助读者更好地理解和应用设计模式,提升代码质量。
Java设计模式梳理:行为型模式(策略,观察者等)
|
1月前
|
设计模式 SQL 安全
【编程进阶知识】Java单例模式深度解析:饿汉式与懒汉式实现技巧
本文深入解析了Java单例模式中的饿汉式和懒汉式实现方法,包括它们的特点、实现代码和适用场景。通过静态常量、枚举类、静态代码块等方式实现饿汉式,通过非线程安全、同步方法、同步代码块、双重检查锁定和静态内部类等方式实现懒汉式。文章还对比了各种实现方式的优缺点,帮助读者在实际项目中做出更好的设计决策。
40 0
|
1月前
|
设计模式 Java
Java设计模式
Java设计模式
28 0
|
5月前
|
设计模式 缓存 安全
Java设计模式的单例模式应用场景
Java设计模式的单例模式应用场景
57 4
|
2月前
|
设计模式 安全 Java
Java 编程中的设计模式:单例模式的深度解析
【9月更文挑战第22天】在Java的世界里,单例模式就像是一位老练的舞者,轻盈地穿梭在对象创建的舞台上。它确保了一个类仅有一个实例,并提供全局访问点。这不仅仅是代码优雅的体现,更是资源管理的高手。我们将一起探索单例模式的奥秘,从基础实现到高级应用,再到它与现代Java版本的舞蹈,让我们揭开单例模式的面纱,一探究竟。
40 11
|
3月前
|
设计模式 存储 负载均衡
【五】设计模式~~~创建型模式~~~单例模式(Java)
文章详细介绍了单例模式(Singleton Pattern),这是一种确保一个类只有一个实例,并提供全局访问点的设计模式。文中通过Windows任务管理器的例子阐述了单例模式的动机,解释了如何通过私有构造函数、静态私有成员变量和公有静态方法实现单例模式。接着,通过负载均衡器的案例展示了单例模式的应用,并讨论了单例模式的优点、缺点以及适用场景。最后,文章还探讨了饿汉式和懒汉式单例的实现方式及其比较。
【五】设计模式~~~创建型模式~~~单例模式(Java)
|
2月前
|
设计模式 Java 安全
Java设计模式-单例模式(2)
Java设计模式-单例模式(2)
|
6月前
|
设计模式 安全 Java
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式
【JAVA】Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式