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

xun yan

最近,当我问到如何使单例模式中的方法线程安全时,有人告诉我使用枚举版本的单例模式是一个不错的选择。并通过多个线程。如果该方法有副作用(更改某些变量的状态),那么您需要考虑保护它(使其同步)或其中的一部分。所以我写了这样的代码:

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();
    }
}

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

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

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

马特·蒂默曼斯

当引用说“唯一实例应该可以通过子类化进行扩展”时,他们指的是以下情况:

  • 你需要一个基类或接口单独实例,以及一个众所周知的访问点,比如 process Logger

  • 您需要在运行时选择具体的实现,例如基于配置或其他运行时信息。Logger例如,您的流程可以由FileLogger实现ConsoleLogger通常,应该可以使用任何子Logger类来实现系统记录器。

你不能用“枚举版本单例模式”来做到这一点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章