Java进阶学习笔记5——Static应用知识:单例设计模式

设计模式:

架构师会使用到设计模式,开发框架,就需要掌握很多设计模式。

在Java基础阶段学习设计模式,将来面试笔试的时候,笔试题目会经常靠到设计模式。

将来会用到设计模式。框架代码中会用到设计模式。

什么是设计模式?(design pattern)

一个问题经常会有n种解法,其中肯定有一种解法是最优的 ,这种优的解法被人总结出来了,称之为设计模式。

设计模式就是具体问题的最优解决方法。

设计模式有20多种,对应20多种软件开发中会遇到的问题。

关于设计模式的学习,主要学什么?

解决什么问题?

怎么写?

主要学这两点就行了。

单例设计模式:

确保一个类只有一个对象。

写法:

1)把类的构造器私有;

2)定义一个类变量记住类的一个对象;

3)定义一个类方法,返回对象。

java 复制代码
package cn.ensource.d6_singleinstance;

public class A {
    // 定义一个类变量记住类的一个对象
    private static A a = new A();

    // 私有构造器
    private A() {

    }

    // 定义一个类方法返回类对象
    public static A getInstance() {
        return a;
    }
}

测试类:

java 复制代码
package cn.ensource.d6_singleinstance;

public class Test1 {
    public static void main(String[] args) {
        // 目标:掌握单例设计模式的方法

        A a1 = A.getInstance();
        A a2 = A.getInstance();

        System.out.println(a1);
        System.out.println(a2);

    }
}

运行结果:

单例设计模式有什么应用场景和好处?

Runtime类就是典型的单例类,Runtime就是程序的运行环境,Java程序运行的时候只有一个运行环境,因此Runtime只需要一个对象,所以就做成了单例类。

任务管理器也是一个单例模式的例子:

无论我启动多少次任务管理器,任务管理器只有一个。一台电脑只需要一个任务管理器,启动多个任务管理器,界面都是一样,只需要一个即可。所以就设计成单例模式。

在这些业务场景下,使用单例模式,避免浪费内存。

单例设计模式的实现方式很多:

饿汉式单例:拿对象时,对象已经创建好了。

懒汉式单例模式:

拿对象的时候,才开始创建对象(延时加载对象)。

写法:

1)把类的构造器私有。

2)定义一个类变量用于存储对象;

3)提供一个类方法,保证返回的是同一个类对象。

java 复制代码
package cn.ensource.d6_singleinstance;

public class B {
    // 2. 定义一个类变量,用于存储这个类的一个对象,这个时候没有创建对象
    private static B b;

    // 1. 私有构造器,对外就不能创建对象了
    private B() {

    }

    // 3. 定义一个类方法,这个方法要保证第一次调用才创建一个对象,后面调用时都会用同一个对象返回
    public static B getInstance() {
        // 第一次,就是b对象还没创建为空null
        if (b == null) {
            b = new B();
        }
        return b;
    }
}
java 复制代码
package cn.ensource.d6_singleinstance;

public class Test2 {
    public static void main(String[] args) {
        // 目标:掌握懒汉式单例模式
        B b1 = B.getInstance();
        System.out.println(b1);
        B b2 = B.getInstance();
        System.out.println(b2);
    }
}

运行结果:

如果单例对象使用的不是很频繁,就使用懒汉式单例模式。

如果使用的很频繁,就是饿汉式单例模式。

相关推荐
字节源流3 小时前
关于maven的依赖下不下来的问题
java·maven
pjx9874 小时前
服务间的“握手”:OpenFeign声明式调用与客户端负载均衡
java·运维·spring·负载均衡
prinrf('千寻)4 小时前
MyBatis-Plus 的 updateById 方法不更新 null 值属性的问题
java·开发语言·mybatis
老华带你飞4 小时前
实习记录小程序|基于SSM+Vue的实习记录小程序设计与实现(源码+数据库+文档)
java·数据库·spring boot·小程序·论文·毕设·实习记录小程序
在未来等你5 小时前
互联网大厂Java求职面试:AI与大模型应用集成及云原生挑战
java·微服务·ai·kubernetes·大模型·embedding·spring ai
源码技术栈5 小时前
SaaS基于云计算、大数据的Java云HIS平台信息化系统源码
java·大数据·云计算·云his·his系统·云医院·区域his
编程、小哥哥5 小时前
互联网大厂Java面试:从Spring Boot到微服务架构的技术深挖
java·spring boot·redis·微服务·prometheus·面试技巧
揽你·入怀5 小时前
数据结构:ArrayList简单实现与常见操作实例详解
java·开发语言
okok__TXF5 小时前
SpringBoot3+AI
java·人工智能·spring
AA-代码批发V哥6 小时前
Math工具类全面指南
java·开发语言·数学建模