我想强制子类实现单例模式。
我最初想在父类中有一个抽象的静态属性,但后来,这就没有意义了(抽象的需求和实例)。
接下来,我想有一个带有静态属性的接口,但这也没有意义(接口也需要一个实例)。
这是可能的,还是我应该放弃这种思路,建立一个抽象的工厂?

最佳答案

请重新考虑。你不想在这里使用单子。您正在向从您的类派生的用户提供一些功能。没关系。但你也在用一种特定的方式来口授,它必须一直被使用,而且完全没有理由。那不好。
大多数时候只实例化这个类的一个对象可能是有意义的,但在这种情况下,只需实例化一次对象。你不太可能在没有注意到的情况下意外地实例化十几个对象。
而且,你怎么知道拥有两个实例永远都没有用呢?我现在还能想到几个案子。
单元测试:您可能希望每个测试都实例化这个对象,然后再次将其删除。而且由于大多数人都有不止一个单元测试,因此需要多次实例化它。
或者你可能在某个时候决定在游戏中使用多个相同/相似的级别,这意味着创建多个实例。
单身汉给你两样东西:
保证对象的实例不会超过一个,并且
对该实例的全局访问
如果你不同时需要这两样东西,还有更好的选择。
您当然不需要全局访问。(全局变量是不好的,通常是设计不好的症状,特别是在可变数据(如游戏状态)中)
但您也不需要保证不会有多个实例被实例化。
如果我将对象实例化两次,这是世界末日吗?应用程序会崩溃吗?如果是的话,你需要保证。
但对你来说,不会发生什么坏事。实例化对象的人只需使用比所需更多的内存。但他可能有原因。
只需在类文档中说明这是一个非常大且代价高昂的类,并且您不应该过多地实例化它。问题解决了。您不会删除以后可能有用的灵活性,因为没有理由,您不允许全局访问数据。因为您可以控制谁可以看到对象,所以不需要将其淹没在锁中,这将成为多线程应用程序的瓶颈。您的代码中没有分散的隐藏依赖项,这使得测试和重用变得更加困难。

09-12 11:05