第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 方法的时候才有可能创建该类的对象【懒创建】
📗 可能有线程安全问题

如有错误,请不吝赐教!

相关文章
|
3天前
|
设计模式 缓存 安全
「全网最细 + 实战源码案例」设计模式——单例设计模式
单例模式是一种创建型设计模式,确保一个类在整个程序运行期间只有一个实例,并提供一个全局访问点来获取该实例。它常用于控制共享资源的访问,如数据库连接、配置管理等。实现方式包括饿汉式(类加载时初始化)、懒汉式(延迟加载)、双重检查锁、静态内部类和枚举单例等。其中,枚举单例最简单且安全,能有效防止反射和序列化破坏。
24 7
|
2月前
|
设计模式 前端开发 JavaScript
JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式
本文深入探讨了JavaScript设计模式及其在实战中的应用,涵盖单例、工厂、观察者、装饰器和策略模式,结合电商网站案例,展示了设计模式如何提升代码的可维护性、扩展性和可读性,强调了其在前端开发中的重要性。
50 2
|
4月前
|
设计模式 存储 安全
设计模式——设计模式介绍和单例设计模式
饿汉式(静态常量)、饿汉式(静态代码块)、懒汉式(线程不安全)、懒汉式(线程安全,同步方法)、懒汉式(线程不安全,同步代码块)、双重检查(推荐,线程安全、懒加载)、静态内部类(推荐)、枚举(推荐)
|
5月前
|
设计模式 JavaScript 前端开发
从工厂到单例再到策略:Vue.js高效应用JavaScript设计模式
【8月更文挑战第30天】在现代Web开发中,结合使用JavaScript设计模式与框架如Vue.js能显著提升代码质量和项目的可维护性。本文探讨了常见JavaScript设计模式及其在Vue.js中的应用。通过具体示例介绍了工厂模式、单例模式和策略模式的应用场景及其实现方法。例如,工厂模式通过`NavFactory`根据用户角色动态创建不同的导航栏组件;单例模式则通过全局事件总线`eventBus`实现跨组件通信;策略模式用于处理不同的表单验证规则。这些设计模式的应用不仅提高了代码的复用性和灵活性,还增强了Vue应用的整体质量。
83 1
|
5月前
|
设计模式 人工智能 Java
Java 如何使用单例类
Java 如何使用单例类
23 1
|
5月前
|
设计模式 Java
【Java】单例设计模式
【Java】单例设计模式
|
26天前
|
设计模式 前端开发 搜索推荐
前端必须掌握的设计模式——模板模式
模板模式(Template Pattern)是一种行为型设计模式,父类定义固定流程和步骤顺序,子类通过继承并重写特定方法实现具体步骤。适用于具有固定结构或流程的场景,如组装汽车、包装礼物等。举例来说,公司年会节目征集时,蜘蛛侠定义了歌曲的四个步骤:前奏、主歌、副歌、结尾。金刚狼和绿巨人根据此模板设计各自的表演内容。通过抽象类定义通用逻辑,子类实现个性化行为,从而减少重复代码。模板模式还支持钩子方法,允许跳过某些步骤,增加灵活性。
|
2月前
|
设计模式 安全 Java
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
Kotlin教程笔记(51) - 改良设计模式 - 构建者模式
|
1天前
|
设计模式
「全网最细 + 实战源码案例」设计模式——模式扩展(配置工厂)
该设计通过配置文件和反射机制动态选择具体工厂,减少硬编码依赖,提升系统灵活性和扩展性。配置文件解耦、反射创建对象,新增产品族无需修改客户端代码。示例中,`CoffeeFactory`类加载配置文件并使用反射生成咖啡对象,客户端调用时只需指定名称即可获取对应产品实例。
57 40
|
2天前
|
设计模式 关系型数据库
「全网最细 + 实战源码案例」设计模式——简单工厂模式
简单工厂模式是一种创建型设计模式,通过工厂类根据传入参数创建不同类型的对象,也称“静态工厂方法”模式。其结构包括工厂类、产品接口和具体产品类。优点是封装性强、代码复用性好;缺点是扩展性差,增加新产品时需修改工厂类代码,违反开闭原则。适用于对象种类较少且调用者无需关心创建细节的场景。
35 19

热门文章

最新文章