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

📗 可能有线程安全问题

如有错误,请不吝赐教!

相关文章
|
3天前
|
设计模式 算法 Java
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
[设计模式Java实现附plantuml源码~行为型]定义算法的框架——模板方法模式
|
3天前
|
设计模式 JavaScript Java
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
[设计模式Java实现附plantuml源码~行为型] 对象状态及其转换——状态模式
|
3天前
|
设计模式 存储 JavaScript
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
[设计模式Java实现附plantuml源码~创建型] 多态工厂的实现——工厂方法模式
|
3天前
|
设计模式 Java Go
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
[设计模式Java实现附plantuml源码~创建型] 集中式工厂的实现~简单工厂模式
|
18天前
|
设计模式 SQL 算法
设计模式了解哪些,模版模式
设计模式了解哪些,模版模式
19 0
|
1月前
|
设计模式 Java uml
C++设计模式之 依赖注入模式探索
C++设计模式之 依赖注入模式探索
37 0
|
3月前
|
设计模式 存储 算法
Java 设计模式最佳实践:三、行为模式
Java 设计模式最佳实践:三、行为模式
22 0
|
2月前
|
设计模式 前端开发 JavaScript
观察者模式 vs 发布-订阅模式:两种设计模式的对决!
欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚开始学习前端的读者们打造的。无论你是初学者还是有一些基础的开发者,我们都会在这里为你提供一个系统而又亲切的学习平台。我们以问答形式更新,为大家呈现精选的前端知识点和最佳实践。通过深入浅出的解释概念,并提供实际案例和练习,让你逐步建立起一个扎实的基础。无论是HTML、CSS、JavaScript还是最新的前端框架和工具,我们都将为你提供丰富的内容和实用技巧,帮助你更好地理解并运用前端开发中的各种技术。
|
15天前
|
设计模式 Java 数据库
小谈设计模式(2)—简单工厂模式
小谈设计模式(2)—简单工厂模式
|
5天前
|
设计模式
设计模式(一)简单工厂模式
设计模式(一)简单工厂模式
13 0