关于设计模式:社区什么时候认为使用Singleton是合适的?

When does the Community believe that it is appropriate to use a Singleton?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Singleton: How should it be used

从伊万?马克和平(Ewan Makepace)早先提出的关于独生子模式的优秀问题开始,我想我会问"社区何时认为使用独生子是合适的?"

让我举一个例子来批评:

我有一个"IconManager"单曲。它首先读取一个属性文件,该文件指示图标在磁盘上的位置,然后读取所有图标并缓存它们以备将来使用。

图标可以在我的整个用户界面上使用(标签、表格、框架等)。因此,通过静态单例方法访问它们是非常方便的。我还想确保图标只被读取一次(如果每次我需要图标时从磁盘上读取图标的速度非常慢),社区是否认为这是单例的适当使用?如果不是,那么它是如何实现的呢?

单件的其他有效用途是什么?


另一种方法是创建类的实例,加载图标,然后向需要访问资源的每个控件传递对该实例的引用。这样,将来您可以拥有多个图标加载程序,并根据需要传递它们。对未来更为灵活,但有相当大的缺点,使你把参考信息传递给无数的控制。


你的图标管理器实现工厂模式,它建立图标。您可能只需要一个工厂来构建图标。所以在这个案例中使用单例imho没有问题。我已经用这些集中化的工厂构建了软件,一切都很顺利。

另请参阅此线程:使用singleton类的最常见示例


当访问一个可能只有一个活动连接的资源时,最好使用singleton。有许多硬件设备都有这个限制。

假设您连接的是只允许一个连接的闭路电视摄像机。单例模式将在第一次使用时创建此连接,并使其保持打开状态。无论何时,只要你需要一张相机的照片,可能来自多个来源,你可以点击单件,知道,所有其他问题考虑,图片将可用。

如果相机的初始连接时间也很慢,那么以这种方式保持连接打开而不是打开连接,抓取图片并再次关闭连接会更有效。


实际上,我从来没有使用过单例,但没有使用过太多的设计模式。我认为当其他模式需要它们时,比如工厂模式和网关模式,它们是非常有价值的。然而,它们几乎从来都不是好的。

您可能会考虑单态模式,它为您提供了单态模式的所有好处,而没有许多缺点。这还允许您拥有一个富对象,该对象的状态恰好具有您要查找的全局属性。