2009-06-13 79 views
0

四人帮使用负载平衡器示例来演示单例模式。我只是想知道为什么在这个例子中需要使用单例?是否还有其他真正的例子可以用单例模式进行具体演示?单例示例

我只想知道更多具体的原因,为什么我想防止创建一个以上的对象实例。而且,我的意思是,如果有多个负载均衡器实例,那又如何?

+0

对于人们关于何时使用Singleton的一般争论,请参阅http://stackoverflow.com/questions/86582/singleton-how-should-it-be-used – 2009-06-13 02:47:03

回答

0

在一个应用程序中,我有一个清单,用于保存从服务器检索的XML数据。这起到了一种“缓存”的作用,可以防止查找多次发生。我没有将对象的引用传递给对象,而是创建了一个Singleton,它可以在运行时由任何对象访问。

+0

我喜欢这个答案最好,但它仍然只是讨论易用性,而不是Singleton实现的NEED。 我想我没有得到的是,如果我写我的代码,只调用一个对象的构造函数,是不是这样的控制级别使单一类的单一? – 2009-06-15 14:18:43

+0

如果您保证只调用一次某个构造函数,那么通过一切手段 - 保持简单并且不要使用Singleton。然而,问题是未来的可扩展性和变化。你能保证你永远不需要再次调用构造函数吗?如果不是的话,你能否通过参考来传授课程,还是会让你的设计更加复杂?控制对象的构建是面向对象的一个​​重要方面,而且实际上只需要一些预先设想。如果你不需要Singleton(或者想避免使用它的一些问题),简单将决定不使用一个:) – bedwyr 2009-06-15 14:58:57

0

我刚刚用一个实例化一个ASP.NET应用程序的Flexwiki引擎,因为对于那个特定的应用程序,我只需要将wiki语法转换成HTML的功能。引擎本身消耗大量内存,我只需要它的一小部分来满足我的需求。此外,它不依赖于个人用户,因此可以将其存储在缓存中。拥有另一个引擎实例将毫无意义,因为除了浪费内存外,它没有其他用途。

0

如果您有一个客户端服务器应用程序,那么您的服务每个连接可能只需要一个客户端。例如,我需要我的服务注册一个回调:

public class myClient 
{ 
    public myClient() 
    { 
     myService = // get service somehow 
     myService.Init(myCallback); 
    } 
    public void myCallback() { /* do something*/} 
} 

如果创建myClient的第二个实例,你将覆盖与第二第一回调。

2

如果一次有多个工作负载平衡器不能很有效。如果一个负载均衡器将工作分配给设备,则另一个均衡器出现并将工作分配给同一设备,则系统很容易变得不平衡。多个负载均衡器需要相互通信才能完成他们的工作。拥有平衡器的单个实例更简单,更高效。

调用Singleton的应用程序的另一个例子是一个软件模块,它的工作是与串口上的设备对话。我最近实施了一个与电机控制器通信的课程,我想确保只有一个班级访问串行线路。将这个类作为Singleton实现可以确保永远不会创建两个实例,从而避免争用串口线。