【Java SE】单例设计模式

发布于:2025-03-22 ⋅ 阅读:(20) ⋅ 点赞:(0)

参考笔记:深入理解Java设计模式:单例模式及其饿汉式与懒汉式的对比,-CSDN博客

目录

1.什么是设计模式

2.经典设计模式

3.单例设计模式(static属性/方法经典使用场景 )

3.1 饿汉式单例模式

3.2 懒汉式单例模式

4.补充


1.什么是设计模式

设计模式是在大量的实践中总结和理论化之后优的代码结构、编程风格、以及解决问题的思考方式

2.经典设计模式

经典的设计模式共 23 种 

① 创建型模式,共 5 种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式

② 结构性模式,共 7 种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式

③ 行为型模式,共 11 种:策略模式、模板方法模式、观察者模式、迭代器模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式


3.单例设计模式(static属性/方法经典使用场景 )

单例设计模式:采取一定的方法保证在整个软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法

单例设计模式主要有以下三个特点:

① 只能有一个实例
② 必须自己创建自己的唯一实例  
③ 必须给所有其他对象提供这一实例

3.1 饿汉式单例模式

① 特点:立即加载,类加载时就会把 single 创建完毕

② 优点:实现简单,不会有多线程安全问题

③ 缺点:当类加载时,会初始化 static 变量,静态变量被创建并分配内存空间。从这以后,这个 sttaic 的实例便一直占着这块内存,直到类被卸载时,静态变量被销毁,并解释所占用的内存空间。因此饿汉式单例模式在特定条件下会耗费内存

public class Test {
    public static void main(String[] args) {
        Singleton single1 = Singleton.getInstance();
        Singleton single2 = Singleton.getInstance();
        System.out.println(single1==single2);//true
        System.out.println(single1);
        System.out.println(single2);
    }
}

//饿汉式单例模式
class Singleton {

    private String name;


    // 1.私有化构造器,防止直接在其他类new对象
    private Singleton(String name) {
        this.name = name;
    }

    // 2.内部提供一个当前类的实例
    // 4.为了能够在静态方法getInstance中返回变量,single也必须静态化(静态方法只能调用静态属性/方法)
    private static Singleton single = new Singleton("小马");

    // 3.提供公共的静态的方法,返回当前类的对象
    public static Singleton getInstance() {
        return single;
    }

    @Override
    public String toString() {
        return "Singleton{" +
                "name='" + name + '\'' +
                '}';
    }
}

3.2 懒汉式单例模式

先看代码,后面再总结

public class Test {
    public static void main(String[] args) {

        //single1和single2是同一对象
        Singleton single1 = Singleton.getInstance();
        Singleton single2 = Singleton.getInstance();
        System.out.println(single1==single2);//true
        System.out.println(single1);
        System.out.println(single2);
    }
}

//懒汉式单例模式
class Singleton {
    // 1.私有化构造器
    private Singleton() {
    }
    // 2.内部提供一个当前类的实例
    // 4.此实例也必须静态化
    private static Singleton single;
    // 3.提供公共的静态的方法,返回当前类的对象
    public static Singleton getInstance() {
        if(single == null) {
            single = new Singleton();
        }
        return single;
    }
}
/*输出结果
true
Singleton@1b6d3586
Singleton@1b6d3586
*/

① 特点:延迟加载,只有在调用静态方法 getInstancesingle 才被分配内存空间

② 优点:实现简单

    (1)饿汉式在类加载时就创建了对象实例,但是可能这个对象后面没有用或者用的少,就造成浪费;

    (2)懒汉式在类加载时 static 实例未被创建和分配内存空间,只有当静态方法 getInstance 第一次被调用时才返回对象,再次调用时,返回的也是上次调用的对象,因此保证了仅一个实例对象

③ 缺点:在多线程环境中,该实现方法存在线程安全问题,不能保证单例的唯一性

说明: 3 个线程同时进入 if 语句中,new3 次,破环了单例设计模式的原则 

4.补充

JavaSE 类库中,java.lang.Runtime 就是经典的单例模式,且是饿汉式的