Java 中的单例设计模式

设计模式

1. 什么是设计模式

  • 设计模式是静态方法和静态属性的经典使用。
  • 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局,我们可以使用不同的棋谱,免去了我们自己的摸索。

2. 什么是单例模式

  • 单例(单个的示例)
  1. 所谓类的单例设计模式,就是采取一定的方法保证在整个的团软件系统中,对某个类的只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
  2. 单例模式有两种方式:(1)饿汉式;(2)懒汉式。

3. 饿汉式单例模式的实现

  • 具体步骤:

(1)将类的构造器私有化,防止其他类直接创建该类对象。
(2)在类的内部创建一个 static 对象。
(3)该类向外提供一个静态的公共方法,返回 static 对象。

  • 代码实现:

public class SingleTon01 {

    public static void main(String[] args) {
		
        //通过静态方法可以直接获取对象,
        GirlFriend instance = GirlFriend.getInstance();
        System.out.println(instance);

        GirlFriend instance2 = GirlFriend.getInstance();
        System.out.println(instance2);// instance和instance2 其实是同一个对象

        System.out.println(instance == instance2);// true
    }

}

// GirlFriend 类
// 要求只能有一个女朋友
class GirlFriend {

    private String name;

    //为了能够在静态方法中,返回 gf 对象,需要将其修饰为 static
    //對象,通常是重量級的對象, 餓漢式可能造成創建了對象,但是沒有使用,造成资源的浪费
    private static GirlFriend gf = new GirlFriend("小红红");

    //如何保障我们只能创建一个 GirlFriend 对象
    //步骤[单例模式-饿汉式]
    //1. 将构造器私有化,防止其他类直接创建该类对象
    //2. 在类的内部直接创建对象(该对象是static)
    //3. 提供一个公共的static方法,返回 gf 对象
    private GirlFriend(String name) {
        System.out.println("構造器被調用...");
        this.name = name;
    }

    public static GirlFriend getInstance() {
        return gf;
    }

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

  • 思考:

(1)为什么要将公共的访问对象的方法 getInstance() 设置成静态方法,去掉static 可以吗?

  • 不可以,我们想要在其他类中不创建该类的对象就可以调用该方法,因此只能将其设置为静态方法。

(2)为什么要类中创建 static 的对象,去掉static 修饰符可以吗?

  • 不可以,在类中访问对象的方法 getInstance() 是静态方法,其只能返回静态的属性,因此只能将对象设置成 静态对象。

(3)饿汉式的弊端是什么?

  • 弊端在于:在类加载时,该对象就会被自动创建了,无论有无使用该对象,它都存在,会造成资源的浪费。

4. 懒汉式单例模式的实现

  • 具体步骤:

(1)将类的构造器私有化,防止其他类直接创建该类对象。
(2)在类的内部声明一个 static 对象,但没有真正创建对象空间。
(3)该类向外提供一个静态的公共方法,返回 static 对象。
(4)只有当用户第一次使用公共方法时,才创建对象空间;后面再次使用时,返回上次创建的对象。

  • 代码实现:

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

        Cat instance = Cat.getInstance();
        System.out.println(instance);
        
        //再次調用 getInstance
        Cat instance2 = Cat.getInstance();
        System.out.println(instance2);

        System.out.println(instance == instance2);// True
    }
}


//希望在程序運行過程中,只能創建一個Cat對象
//Cat 类
class Cat {
    private String name;

    private static Cat cat; // 默認是null,并未真正创建对象空间

    // 步驟
    //(1)将类的构造器私有化,防止其他类直接创建该类对象。
    //(2)在类的内部声明一个 static 对象,但没有真正创建对象空间。
    //(3)该类向外提供一个静态的公共方法,返回 static 对象。
    //(4)只有当用户第一次使用公共方法时,才创建对象空间;后面再次使用时,返回上次创建的对象。
    //  從而保證了單例
    private Cat(String name) {
        System.out.println("構造器調用...");
        this.name = name;
    }

    public static Cat getInstance() {

        if(cat == null) {//如果還沒有創建cat對象
            cat = new Cat("小可愛");
        }
        return cat;
    }

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

5. 饿汉式和懒汉式的比较

  • 如下图:
    在这里插入图片描述

总结

  • 本文是小白博主在学习B站韩顺平老师的Java网课时整理总结的学习笔记,在这里感谢韩顺平老师的网课,如有有兴趣的小伙伴也可以去看看。
  • 本文详细解释了设计模式中的单例模式的概念与使用,并深入讲解了饿汉式和懒汉式单例设计模式的使用和区别,希望小伙伴们看后能有所收获!
  • 最后,如果本文有什么错漏的地方,欢迎大家批评指正!一起加油!!我们下一篇博文见吧!
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林二月er

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值