当前位置: 首页 > news >正文

JAVA学习*单列模式

概念

单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供一个全局访问点(提供一个公开的方法)来获取这个实例。

饿汉式

代码展示:

public class EagerInitialization {
    private static EagerInitialization instance = new EagerInitialization();
    private EagerInitialization() {
    }
    public static EagerInitialization getInstance() {
        return instance;
    }
}
public class Test {
    public static void main(String[] args) {
        EagerInitialization instance1 = EagerInitialization.getInstance();
        EagerInitialization instance2 = EagerInitialization.getInstance();
        System.out.println(instance1 == instance2);
    }
}

输出:
true

代码解释:

1、 为了只能实例化一个对象,此时将构造方法变成私有的,在类外就无法实例化对象。
2、 在类内创建了一个对象,设为私有(封装实例,控制访问:外部代码无法直接访问或修改该变量),同时提供一个能得到对象的接口(方法)。
3、 使用static修饰这个对象,使其在类加载时就会初始化且被创建一次。
4、 通过 private 对构造方法和实例变量的双重控制,从 “禁止外部创建” 和 “封装内部实例” 两个维度,严格保障了单例模式 “全局唯一实例” 的特性。
5、 在应用程序启动时就进行单列对象的初始化,无论是否被使用过。但当对象一直没有被使用过,可能会浪费系统资源,占用内存。

懒汉式

代码展示:

public class LazyInitialization {
    private static LazyInitialization instance;
    private LazyInitialization() {
    }
    public static LazyInitialization getInstance() {
        if(instance == null) {
            instance = new LazyInitialization();
        }
        return instance;
    }
}
public class Test {
    public static void main(String[] args) {
        LazyInitialization instance1 = LazyInitialization.getInstance();
        LazyInitialization instance2 = LazyInitialization.getInstance();
        System.out.println(instance1 == instance2);
    }
}

输出:
true

代码解释:

1、 相比饿汉式来说,这个只有在首次使用时才创建实例。
2、 为了只能实例化一个对象,此时将构造方法变成私有的,在类外就无法实例化对象。
3、 使用private和static修饰instance,使其封装和创建一次。初始为null
4、 对于if语句就是检查instance是否为null,即是否已经创建过实例了。如果没有就创建实例。当创建了实例,返回存储的实例(并没有再次创建实例进行返回)。
5、 这段代码线程不安全,具体的改进后面会学习。

还有其他的单列模式可以自行学习

http://www.dtcms.com/a/98869.html

相关文章:

  • Linux进程状态补充(10)
  • 18-动规-子序列中的 k 种字母(中等)
  • Python --- .flush() 强制输出缓冲区的数据(缓冲区未满)
  • 代码随想录算法训练营--打卡day3
  • HTML元素小卖部:表单元素 vs 表格元素选购指南
  • 从零开始研发GPS接收机连载——19、自制GPS接收机的春运之旅
  • 《Spring Cloud Eureka 高可用集群实战:从零构建高可靠性的微服务注册中心》
  • 【RabbitMQ】Linux上安装RabbitMQ详细步骤
  • 全球化2.0 | ZStack举办香港Partner Day,推动AIOS智塔+DeepSeek海外实践
  • 嵌入式libc
  • [创业之路-344]:战略的本质是选择、聚焦, 是成本/效率/低毛利优先,还是差易化/效益/高毛利优先?无论是成本优先,还是差易化战略,产品聚焦是前提。
  • 基于HTML5和CSS3实现3D旋转相册效果
  • linux课程学习二——缓存
  • JAVA的内存图理解
  • C/C++回调函数实现与std::function和std::bind介绍
  • 综合实验2
  • std::scoped_lock vs std::unique_lock:多线程锁的选择指南
  • mysql.8.4.4主从配置--IOthread:NO
  • 图解CMS原理是什么?漏标+多标+浮动垃圾 如何解决?
  • LeetCode1两数之和
  • Ubuntu社区论坛正确网址
  • Elea AI:以人工智能之力推动病理实验室革新的技术突破与实践探索
  • 10-项目需求变更时如何处理
  • sqli-labs靶场 less 9
  • Banner区域
  • Cursor 汉化教程
  • react学习
  • C++中的new、malloc、realloc、calloc——特点?函数原型?释放方式?区别?校招面试常问内容?
  • 中断管理常用API(四)
  • 马斯克:1130 亿美元的操作,X 网友:有点感觉被卖了…