社区何时认为使用Singleton是合适的?
Possible Duplicate: Singleton: How should it be used
继Ewan Makepeace先前关于Singleton模式的出色问题之后,我想问我:"社区何时认为使用Singleton是合适的?"
让我举一个例子来批评:
我有一个" IconManager"单例。首先读取属性文件,该文件指示我的图标在磁盘上的位置,然后读取所有图标并将其缓存以备将来使用。
这些图标可以在我的整个UI(选项卡,表格,框架等)中使用...因此,通过静态Singleton方法访问它们非常方便。我还想确保只读取一次图标(如果每次需要时从磁盘读取图标的速度都很慢),社区是否认为这是对Singleton的适当使用?如果没有,该如何实施?
单身人士还有哪些其他有效用途?
解决方案
一种替代方法是创建类的实例,以加载图标,然后将对该实例的引用传递给需要访问资源的每个控件。这样,将来我们可以拥有多个图标加载器,并根据需要传递它们。将来更灵活,但缺点是使我们将参考传递给不计其数的控件。
IconManager实现工厂模式,并生成图标。而且我们可能只需要一个工厂即可构建图标。因此,在这种情况下使用单例恕我直言没有问题。我已经使用其中一些集中化工厂构建了软件,并且一切正常。
另请参见以下线程:滥用单例类的最常见示例
实际上,我从来没有使用过单例,但是没有使用太多的设计模式。我认为,当其他模式(例如Factory和Gateway模式)需要它们时,它们非常有价值。但是,他们自己几乎从来都不是好人。
我们可能需要考虑使用Monostate模式,它为我们提供了单例的所有优点,而没有很多缺点。这也使我们可以拥有一个丰富的对象,该对象的状态恰好具有我们要查找的全局属性。
当访问仅具有一个活动连接的资源时,单例的一种好用法。有许多硬件设备都有此限制。
假设我们要连接到仅允许一个连接的CCTV摄像机。 Singleton模式将在首次使用时创建此连接并使其保持打开状态。每当我们需要从相机(可能是来自多个来源)的图片时,只要知道(还有其他考虑在内)图片都可以使用,我们就可以打动Singleton。
如果相机的初始连接时间也很慢,则以这种方式保持连接打开而不是打开连接,抓图并再次关闭连接可能会更有效。