c# - 我们应该密封单例吗?我们应该首先尝试继承单例吗?

标签 c# java inheritance singleton

应该允许单例类有 child 吗?我们应该密封它吗?优点和缺点是什么?

为了能够从 Singleton 类继承,我们必须使构造函数 protected 而不是私有(private)。现在,这在 C# 中没问题,但在 Java 中 protected 字使子类和包类都可以访问构造函数。这意味着不仅从我们的 Singleton 继承的类可以访问构造函数,同一包中的其他类也可以这样做。

我对所有这些事实感到有点困惑。或许是我小题大做了,没什么好担心的?到现在为止,我从来没有任何必要尝试从 Singleton 继承,所以也许这只是一个学术问题!

谢谢

最佳答案

是的,单例应该被密封。不,它们不应该被继承。

原因是 Singleton 的主要(实际上唯一)行为是在某个预定时间创建它自己的实例。由于这个功能是静态的,它不能被覆盖,所以它必须被复制。一旦你开始复制,你就会有一个单例的多个实例,这真的没有意义。

要么你最终会遇到竞争条件或其他冲突,因为“派生的”单例会争夺对全局实例的控制权,这不仅没有意义,而且很危险。

单例继承问题有一些骇人听闻的解决方法,但这就是它们的本质 - 骇客。单例模式不太适合继承。

关于c# - 我们应该密封单例吗?我们应该首先尝试继承单例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2573492/

相关文章:

c# - 从多个线程修改 Entity Framework 实体

c# - MemoryStream 写入时出现 OutOfMemoryException

c# - XmlSerializer 找不到文件 C :\Windows\Temp\*. dll

java - 如何使用jsp将java数组传输到javaScript数组?

java - 尝试向标记添加信息窗口时遇到困难?

c# - 单独 git 存储库中的服务结构项目

java - 在这种情况下,我们需要使用 HttpClient 和其他网络服务

java - 具有持久子类的非持久父类(super class)

c# - 为什么要调用父级的构造函数?

java - 了解扩展类和导入类之间的区别