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

📗 可能有线程安全问题

如有错误,请不吝赐教!

相关文章
|
设计模式 缓存 安全
「全网最细 + 实战源码案例」设计模式——单例设计模式
单例模式是一种创建型设计模式,确保一个类在整个程序运行期间只有一个实例,并提供一个全局访问点来获取该实例。它常用于控制共享资源的访问,如数据库连接、配置管理等。实现方式包括饿汉式(类加载时初始化)、懒汉式(延迟加载)、双重检查锁、静态内部类和枚举单例等。其中,枚举单例最简单且安全,能有效防止反射和序列化破坏。
483 7
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
340 2
|
设计模式 存储 安全
设计模式——设计模式介绍和单例设计模式
饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全,同步方法)、懒汉式(线程不安全,同步代码块)、双重检查(推荐,线程安全、懒加载)、静态内部类(推荐)、枚举(推荐)
设计模式——设计模式介绍和单例设计模式
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
495 1
|
设计模式 人工智能 Java
Java 如何使用单例类
Java 如何使用单例类
183 1
|
设计模式 Java
【Java】单例设计模式
【Java】单例设计模式
130 0
|
10月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
447 1
|
10月前
|
JSON 网络协议 安全
【Java基础】(1)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
418 1
|
11月前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案
Java 数据库 Spring
465 0