【问题标题】:about singleton关于单身人士
【发布时间】:2012-09-20 06:11:38
【问题描述】:

好吧,我读到单例很糟糕,因为它们是反模式。我还读到,这样做的主要原因是对单例的全局引用,无论如何:

是否总是可以避免单例?

如果是这样,比如说我有一个 IOCP 网络,我需要对其进行一次初始化,并且该对象需要在软件的整个生命周期中保持不变。同样带有一个我称之为“绘画”的类,我将数据打印到屏幕上。 如果我没有单独使用它,我仍然需要当前 Hwnd 的全局变量,并在每次我要使用它时在本地初始化对象(真的很烦人)。

所以使用单例是我的设计有缺陷的标志吗? 我能做些什么来避免它们?

谢谢。

【问题讨论】:

  • 单例不是反模式。这是一个模式! Singleton@Wiki。您还可以描述一个 getter 方法,它返回对类中实例的引用,并通过继承或聚合提供访问。它们很好,使用它们也不是什么大不了的事。
  • @Pie_Jesu 你错了。在 99.5% 的单例使用情况下是错误的。
  • 恕我直言,大多数人误解了单例,它的主要重点是不允许构造同一类的其他实例,因此您只有一个实例。如果你去掉“你不能实例化另一个这种类型的对象”,你会发现每个全局都可以用作单例的替代品。您也可以只在类的构造函数中传递您需要的对象。
  • +1 表示i read singleton are bad。真实的故事。
  • 我也不明白为什么having 1 instance is bad。它是一个很好的模式,应该使用。没有看到不使用它的好论据。

标签: c++ oop design-patterns singleton single-instance


【解决方案1】:

是否总是可以避免单例?

是的,使用全局变量,或者(甚至更好)修复您的设计。修复设计的一种选择是使用某种inversion of control

如果你尝试使用OO principles,你会发现你可以不用单例。

【讨论】:

  • 我不知道如何在不使用单例的情况下创建 IOCP 网络,我只需要该对象的一个​​实例。
  • @ffenix 通过只创建一个实例,并将其传递给需要它的构造函数。这是一种方式
【解决方案2】:

这是一个问题,即哪些实体需要访问只能实例化一次的资源,以及何时(以下称为资源)。

如果需要访问该资源的实体可以使用该资源(IOC,依赖注入)进行实例化,那么这是最好的方法,从而保持简单并避免创建单例。 KISS.

如果出于某种原因,有实体需要访问资源,但无法用它实例化,则需要实施替代方案。一个选项是 Singleton,但我喜欢使用的另一个选项是 Factory。这完全封装了资源的创建,并且更具前瞻性,这意味着如果将来由于某种原因,可以实例化多个资源实例,则将其全部封装。您不能/不应该尝试使用单例来执行此操作。当然,工厂内部会维护资源的唯一实例。

有些人会争辩说,如果不能用资源实例化实体,那么设计就是糟糕的。这可以争论,并且可能应该根据具体情况进行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    • 1970-01-01
    • 2011-01-01
    相关资源
    最近更新 更多