在使用枚举版单例模式时,修改单例类代码是扩展单例功能的唯一方法吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在使用枚举版单例模式时,修改单例类代码是扩展单例功能的唯一方法吗?相关的知识,希望对你有一定的参考价值。

最近,当我问how to make methods thread-safe in singleton pattern时,有人告诉我使用枚举版单例模式是一个不错的选择。并由多个线程。如果该方法有副作用(改变某些变量的状态),那么你需要考虑保护它(使它同步)或其中的一部分。所以我写这样的代码:

public enum ReStation {
    INSTANCE;  

    private List<Email> emailList;

    private ReStation() {
        emailList = new ArrayList<>();
    }

    public synchronized void recycleEmail(Email email) {
        System.out.println("Recycle station recycleing the email: "
                        + email.getContent());
        emailList.add(email);
    }

    public synchronized void deleteEmail(Email email) {
        emailList.remove(email);
    }

    public synchronized void clear() {
        emailList.clear();
    }
}

但是,当我读到名为“设计模式 - 可重复使用的面向对象软件的元素”的书时,我遇到了如下段落:

适用性 使用Singleton模式时 •必须只有一个类的实例,并且客户端必须可以从众所周知的访问点访问它。 •当唯一实例应该通过子类化可扩展时,客户端应该能够使用扩展实例而无需修改其代码。

鉴于enum无法扩展,我真的很困惑在使用枚举版单例模式时如何在不修改代码的情况下使用扩展实例?修改单例类代码是扩展单例功能的唯一方法吗?

答案

当引用说“唯一的实例应该可以通过子类扩展”时,他们正在谈论以下情况:

  • 您需要一个基类或接口的单个​​可分辨实例,以及一个众所周知的访问点,如进程Logger;
  • 您需要在运行时选择具体实现,例如基于配置或其他运行时信息。例如,你的过程Logger可以由FileLoggerConsoleLogger实现。通常,应该可以使用任何Logger子类来实现系统记录器。

您无法使用“枚举版单例模式”执行此操作。

以上是关于在使用枚举版单例模式时,修改单例类代码是扩展单例功能的唯一方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

单例模式最好用枚举

单例模式_反射破坏单例模式_枚举类_枚举类实现单例_枚举类解决单例模式破坏

java版单例模式

JAVA单例模式的几种实现方法

java 单例模式这个要怎么理解?

单例模式java实现