重读 Java 设计模式: 解析单例模式,保证唯一实例的创建与应用

本周工作太忙了,变成了加班狗,下班回来也没时间写,只能利用周末时间写了😭。

好了,言归正传,本次我们先来介绍下设计模式中创建型模式-单例模式

一、引言

单例模式是设计模式中最简单但又最常用的一种模式之一。它确保某个类只能有一个实例,并提供了全局访问点,使得该实例在整个应用程序中都可以被访问。在本文中,我们将深入探讨单例模式的实现方式、应用场景以及实践指南。

二、基本概念

除了引言一段中,单例模式除了实例全局唯一全局访问点外,还有其他特点,下面我将一一罗列出来:

  • 实例全局唯一:单例模式确保一个类只有一个实例对象存在,无论在何处访问该类,都将得到相同的实例。通过单例模式,可以防止不必要的多次实例化,确保系统中某个类只有一个实例存在。
  • 全局访问点:单例模式提供了一个全局的访问点,任何地方都可以通过该访问点获取到单例实例。
  • 延迟加载:许多单例模式的实现方式采用了延迟加载的策略,即在需要时才创建实例对象,而不是在类加载时就创建。
  • 线程安全:好的单例模式实现应该是线程安全的,即在多线程环境下也能够正确地保持单例对象的唯一性。
  • 节约资源:单例模式可以节约系统资源,特别是那些需要频繁创建和销毁的对象,如数据库连接、线程池等。
  • 全局状态管理:单例模式可以用于管理全局的状态信息,例如配置管理器、日志系统等

三、单例模式的五种经典实现案例

3.1 饿汉式单例模式

优点:
  • 线程安全:在类加载时就创建实例对象,因此不存在多线程环境下的线程安全问题。
  • 简单易理解:实现简单,易于理解和使用。
缺点:
  • 不支持延迟加载:在类加载时就创建实例对象,可能会导致资源浪费,尤其是在实例对象较大或者初始化过程较为复杂的情况下。
package com.markus.desgin.mode.creational.singleton;

/**
 * @Author: zhangchenglong06
 * @Date: 2024/3/6
 * @Description: 单例模式一:急切初始化
 */
public class EagerlyInitSingleton {
   
   
  // 利用 类加载机制中 static 属性加载特性:全局只加载一遍,不会随实例的初始化重复加载
  private static EagerlyInitSingleton INSTANCE = new EagerlyInitSingleton();

  public static EagerlyInitSingleton getInstance() {
   
   
    return INSTANCE;
  }

  public static void main(String[] args) {
   
   
    EagerlyInitSingleton eagerlyInitSingleton1 = getInstance();
    EagerlyInitSingleton eagerlyInitSingleton2 = getInstance();

    System.out.println(eagerlyInitSingleton1 == eagerlyInitSingleton2);

  }
}

3.2 懒汉式单例模式

优点:
  • 延迟加载:只有在需要时才创建实例对象,节省了系统资源。
  • 简单易理解:实现简单,易于理解和使用。
缺点:
  • 线程不安全:在多线程环境下,如果多个线程同时调用获取实例的方法,可能会创建多个实例对象,导致单例模式失效。
  • 性能低下:由于使用了 synchronized 关键字进行同步,导致性能较低。
package com.markus.desgin.mode.creational.singleton;

/**
 * @Author: zhangchenglong06
 * @Date: 2024/3/6
 * @Description: 单例模式二: 懒加载模式
 */
public class LazyInitSingleton {
   
   
  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值