java学习之单例模式

单例设计模式 什么是单例模式 所谓单例设计模式,就是在软件系统中,某个类只存在一个实例对象,并且也只有一个获得该实例的方法 单例模式有两种方式 饿汉式 懒汉式 步骤如下 构造器私有化 类的内部创建对象 对外暴露一个静态的public方法,用于返回唯一实例(getInstance) 饿汉式 饿汉式是在...
java学习之单例模式
java学习之单例模式

单例设计模式

什么是单例模式

  1. 所谓单例设计模式,就是在软件系统中,某个类只存在一个实例对象,并且也只有一个获得该实例的方法

  2. 单例模式有两种方式

    • 饿汉式
    • 懒汉式
  3. 步骤如下

    • 构造器私有化
    • 类的内部创建对象
    • 对外暴露一个静态的public方法,用于返回唯一实例(getInstance)

饿汉式

饿汉式是在类加载时就创建并且初始化单例对象,这可能造成资源浪费

package com.hspedu.single;

public class Test {
    public static void main(String[] args) {
        GirlFrind instance = GirlFrind.getInstance();
        instance.show();
    }
}

class GirlFrind{
    private String name;

    private static final GirlFrind gf = new GirlFrind("小花");
    private GirlFrind(String name) {
        this.name = name;
    }

    public static GirlFrind getInstance() {
        return gf;
    }

    public void show() {
        System.out.println(this.name);
    }
}

可以看出,gf在类被加载的时候就已经初始化

懒汉式

懒汉式是在类首次调用获取实例的方法时,才创建对象的单例模式

package com.hspedu.single;

public class Test {
    public static void main(String[] args) {
        System.out.println(GirlFrind.n1);
    }
}

class GirlFrind{
    private String name;
    public static int n1 = 10;

    private static GirlFrind gf = null;
    private GirlFrind(String name) {
        System.out.println("构造器被调用");
        this.name = name;
    }

    public static GirlFrind getInstance() {
        if (gf == null) {
            gf = new GirlFrind("小花");
        }
        return gf;
    }

    public void show() {
        System.out.println(this.name);
    }
}

只有当getInstance被调用时,才会创建gf。

执行可以发现,由于只调用了静态成员,因此只加载了类,因此没有调用构造器。

懒汉式和饿汉式的区别

饿汉式 懒汉式 线程安全 安全 不安全,需要额外处理 资源加载时机 类载入就创建实例 调用getInstance才创建 适用场景 单例对象简单、一定被使用 单例对象开销大 潜在问题 可能造成资源浪费 多线程环境下可能创建多个实例

懒汉式的线程安全版本后期补充

2 个帖子 - 2 位参与者

阅读完整话题

来源: LinuxDo 最新话题查看原文