我认为课程不应该是单身人士或静态课程。它有状态,尽管可以由消费者共享。当共享状态存在时,我喜欢远离单身,但我听到的论点是,只要在任何给定时间存在1个对象实例,我将获得性能优势。
在我的特定情况下,没有很多与此对象相关的数据 - 两个字典(每个最多)150个条目和字典。
在什么时候 - 如果有的话 - 表演论证是否具有任何优点?
仅供参考 - 我正在使用.NET。
谢谢!
答案 0 :(得分:5)
没有。性能论证没有任何优点。
在假设有性能问题之前,您应该对性能问题进行基准测试并确认/识别。 10次中有9次不会在你想到的地方。
如果需要单身人士,那就是。
答案 1 :(得分:2)
单例模式主要用于指定您只需要该类的一个实例。静态类通常用于提供无状态行为。你所描述的内容似乎并不适合任何一种类别。我将研究使用缓存而不是单例模式来提高代码的性能。当然,你的缓存可能是一个单独的,但在缓存的情况下它是有意义的。
当然,如果你的对象是一个缓存,那我就把自己说成一个圈子。
答案 2 :(得分:2)
出于性能原因,您不应考虑创建Singleton(或Static类)。
您需要将其设为单身设计,否则您不需要。如果您的类的多个实例应该存在并且彼此不同,那么您不能使用单例。
答案 3 :(得分:1)
我不认为对于使用单例模式而言,性能是一个非常强大的论据。这是一个设计问题,或者使用单例是否有意义:
如果您只需要一个对象实例,请使用单例。
如果您需要多个实例,请不要。
答案 4 :(得分:1)
只有在概念只能是对象的一个实例而不是人为地将开发人员限制为一个实例的情况下,才应该使用Singleton。如果可能有两个实例,则它不应该是Singleton。
如果前者是这种情况,并且存在与该对象相关联的状态,那么如果存在与初始化相关的大量成本并且该类永远不会被使用的可能性,或者推迟初始化的原因,则Singleton是有用的。 。在这种情况下,单身人士是好的。替代我们一个静态类,只要上述不适用,你就应该使用它。
答案 5 :(得分:0)
如果构建成本很高,那么您可能更适合返回公共实例的Abstract Factory模式。单身人士的声誉很差,尤其是TDD人群,但有效的AF和Singleton可以做同样的事情(AF可以做得更多,但这是一个不同的故事)。
由于您的成本不高,因此可能无关紧要。
答案 6 :(得分:0)
通常,单身人士比任何事情都更能抑制表现。这意味着你有在多线程应用程序中将类包装在锁和同步中。如果没有使用单身人士或全球人,那可能就已经避免了。
所以单身人士可能会变慢,但我想不出任何会更快的情况。
如果您希望应用程序共享对象的单个实例,则将引用传递给该对象。这也让你灵活地改变设计,当事实证明,出于缓存或并发原因,使用多个单独的实例实际上会更快。
要记住关于性能的最重要的事情是它很难预测。不管你猜测你的瓶颈是什么,你几乎肯定是错的。因此,确保良好性能的最佳方法是轻松修改程序。单身人士在那里对你不利。一旦你有一个单身人士,几乎不可能删除。即使多个实例表现得更好,即使局部变量而不是全局单例也会提高缓存使用率,你仍然坚持使用该类的一个通用实例。