我们应该密封单身人士吗?我们应该首先尝试从单身人士继承吗?

时间:2010-04-04 03:49:20

标签: c# java inheritance singleton

是否允许Singleton班级生孩子?我们应该密封吗?什么是专业人士和骗子?

为了能够从Singleton类继承,我们必须使构造函数受保护而不是私有。现在,这在c#中会很好,但java中受保护的单词给了子类和包类访问构造函数。这意味着不仅从我们的Singleton继承的类可以访问构造函数,而且同一个包中的其他类也可以这样做。

我对这些事实感到有点困惑。也许我正在做一件大惊小怪的事情,不用太担心?到现在为止,我从来没有必要尝试继承单身人士,所以也许这只是一个学术问题!

由于

5 个答案:

答案 0 :(得分:8)

更好的解决方案是使用IoC容器框架来处理类的“Singleton”(生命周期)方面。此时,您可以使用POJO并简单地继承它。

编辑:一些可能有用的链接:

寻找处理终身管理的人。您希望能够配置容器(其作用类似于通用工厂),以便对“Singleton”类的实例的请求始终返回相同的实例(至少对于同一容器)。通常,只有一个容器实例位于应用程序的最高级别。

答案 1 :(得分:8)

是的,单身人士应该密封。不,他们不应该被继承。

原因是Singleton的主要(实际上只有 )行为是在某个预定时间创建自己的实例。由于此功能是静态的,因此无法覆盖,因此必须重复此功能。一旦你开始复制,你有一个单例的多个实例,这实际上没有意义。

或者你最终遇到竞争条件或其他冲突,因为“派生”的单身人士争夺对全球实例的控制权,这不仅没有意义,而且是危险的。

Singleton继承问题有一些破解性的解决方法,但这就是它们 - 黑客攻击。 Singleton模式不适合继承。

答案 2 :(得分:4)

嗯,这听起来像是我们很多人在学习单身人士时被问到的问题。我建议阅读以下链接。

http://msmvps.com/blogs/jon_skeet/archive/2006/01/20/singleton-inheritance.aspx http://msdn.microsoft.com/en-us/library/84eaw35x.aspx

许多人强烈反对继承单身人士,但现实生活中的编程通常需要这样的方法。我个人会说,不要继承单身作为经验法则,但不要将自己锁定在阻止这种方法的设计中。务实的发展方法始终是最好的方法......

答案 3 :(得分:3)

如果您可以从单例扩展,那么这意味着您可以拥有多个实例。这与整个单身人士的想法相矛盾。只需使它成为一个“普通”类并相应地编写代码,只需将它实例化一次并永远使用相同的实例。如果你需要它。依赖注入可以为此提供很多帮助。

答案 4 :(得分:2)

如果要将继承与单例模式结合使用,则应将可继承的状态和行为放入抽象基类中,并将单例定义为(最终)子类。