设计模式——单例模式

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。


前言

        有些对象天生就是独一无二的。它们代表了一个系统中的某个核心组件,比如配置管理器、连接池或是日志记录器。这些对象通常包含有状态信息,对于整个系统来说,它们的状态必须保持一致。为了确保这种独特性和一致性,我们需要一个特殊的设计模式——单例模式(Singleton Pattern)。简单来说,一个班级只有一个班主任。


一、单例模式的核心角色

  • 单例类(Singleton):定义一个私有的静态实例变量来保存唯一的实例,并实现一个公共的静态方法来提供对这个实例的全局访问。
  • 客户端(Client):使用单例类的公共静态方法来获取唯一的实例,并通过该实例进行操作。

二、具体实现

1.单例类

代码如下(示例):

public class Singleton {
    private static Singleton uniqueInstance;

    private Singleton() {
        // 私有构造函数,防止外部通过new创建实例
    }

    public static synchronized Singleton getUniqueInstance() {
        if (uniqueInstance == null) {
            uniqueInstance = new Singleton();
        }
        return uniqueInstance;
    }

    public void showMessage() {
        System.out.println("Hello, I am a happy singleton!");
    }
}

        public static synchronized Singleton getUniqueInstance()这个方法是单例模式中获取唯一实例的静态方法。它的作用是确保在程序运行期间,只有一个Singleton类的实例被创建。

        首先,方法使用public static修饰符,表示这是一个公共的静态方法,可以通过类名直接调用,而无需创建对象实例。接下来,方法使用了synchronized关键字,这是为了确保在多线程环境下,只有一个线程能够执行该方法。当多个线程同时访问该方法时,它们会被阻塞,直到当前执行该方法的线程完成并释放锁。这样可以防止多个线程同时创建多个实例。

        方法内部的逻辑如下:

  1. 首先检查uniqueInstance是否为null,即是否已经存在一个实例。如果不存在,则进入下一步;如果已经存在,则直接返回该实例。
  2. 如果uniqueInstancenull,则创建一个新的Singleton实例,并将其赋值给uniqueInstance变量。
  3. 最后,返回uniqueInstance变量,即唯一的实例。

通过这种方式,无论何时调用getUniqueInstance()方法,都会返回同一个Singleton实例,从而确保了整个应用程序中只有一个实例存在。

2.客户端

代码如下(示例):

public class Client {
    public static void main(String[] args) {
        // 获取唯一可用的对象
        Singleton singleton = Singleton.getUniqueInstance();
        singleton.showMessage();
    }
}

3.单例模式的应用场景

  1. 当对象的状态需要在多个对象间共享时,例如配置文件的读取和设置。
  2. 当系统中需要一个共享资源的访问点时,如数据库连接池。
  3. 当需要协调多个部分的操作时,如线程池或日志记录器。
  4. 当需要控制资源的创建和使用时,如打印机管理器。
  5. 当这个唯一的实例应该是通过子类化可扩展的,并且客户无须更改代码就能使用一个扩展的实例时。

4.单例模式的优缺点

优点

  • 对资源的节约:由于只有一个实例,减少了系统资源消耗。
  • 对系统性能的提升:避免了频繁地创建和销毁对象。
  • 对系统状态的保证:所有对该唯一实例的引用都访问的是同一个对象,确保了状态的一致性。

缺点

  • 可能导致代码结构复杂:由于单例类的实例化过程可能涉及到多线程同步,这可能会使代码结构变得复杂。
  • 可能违反单一职责原则:单例类通常要负责两个职责,一是确保唯一性,二是执行自己的业务逻辑。
  • 可能不易于测试:全局状态可能会导致测试困难,因为单例对象的状态在整个系统中是共享的。

总结

        单例模式是一种强大的设计模式,它确保了系统中某些关键组件的唯一性和一致性。然而,它也带来了一些挑战,尤其是在多线程环境和测试中。因此,在使用单例模式时,我们需要仔细考虑其适用性,并确保正确地实现和使用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值