使用Singleton模式?给我一个理由先!
2004-08-11 16:30
239 查看
Java Q&A: 使用Singleton模式?给我一个理由先!
Q: 在很多地方我都看到使用了Singleton类。我的问题是:较之一个包含static方法(methds)的类,使用Singleton具有什么优点呢?
A: 不使用包含static方法的类而使用Singleton,其区别在于,后者可以带来有效的面向对象设计。Singleton通常展示的是一种更清晰的方法。而一个包含static方法的类只不过是函数或公用子程序(utilities)的简单罗列。
你会问,罗列一组函数有什么问题?
很简单。罗列函数,你就不是在进行面向对象编程;你的工作实际上倒退到了传统的面向过程的程序设计中。悄然之间,对象不再是程序的焦点,而你自己也陷入到以数据为中心的程序设计模式中。换句话说,你不再是向包装了状态和行为的对象发送消息,而是针对数据进行函数调用。公用子程序必然造成行为和数据完全分离,而这一点在面向对象设计中是绝不允许的。
也不是说完全不能使用公用子程序。面向对象的公用子程序确实存在。有时也需要将对象当作数据来处理。例如,我曾写了一套公共子程序,用来将Java对象转换成相应的CORBA形式。很难将那些方法写成一个类,因为它们确实没有状态信息;我也不想将转换代码嵌入到Java类中。然而,这确实容易带来混乱。
对于系统中的某个类,如果想让它无论什么时候只有一个实例存在,这种情况下可以使用Singleton。例如有这样一个类,它提供对CORBA server的访问,还要做到负载平衡。这时候就不要使用多个这样的对象,因为每个对象都会和相同的server打交道。占用冗余资源当然浪费。所以,对server的访问最好集中到一个实例之中。
Q: 在很多地方我都看到使用了Singleton类。我的问题是:较之一个包含static方法(methds)的类,使用Singleton具有什么优点呢?
A: 不使用包含static方法的类而使用Singleton,其区别在于,后者可以带来有效的面向对象设计。Singleton通常展示的是一种更清晰的方法。而一个包含static方法的类只不过是函数或公用子程序(utilities)的简单罗列。
你会问,罗列一组函数有什么问题?
很简单。罗列函数,你就不是在进行面向对象编程;你的工作实际上倒退到了传统的面向过程的程序设计中。悄然之间,对象不再是程序的焦点,而你自己也陷入到以数据为中心的程序设计模式中。换句话说,你不再是向包装了状态和行为的对象发送消息,而是针对数据进行函数调用。公用子程序必然造成行为和数据完全分离,而这一点在面向对象设计中是绝不允许的。
也不是说完全不能使用公用子程序。面向对象的公用子程序确实存在。有时也需要将对象当作数据来处理。例如,我曾写了一套公共子程序,用来将Java对象转换成相应的CORBA形式。很难将那些方法写成一个类,因为它们确实没有状态信息;我也不想将转换代码嵌入到Java类中。然而,这确实容易带来混乱。
对于系统中的某个类,如果想让它无论什么时候只有一个实例存在,这种情况下可以使用Singleton。例如有这样一个类,它提供对CORBA server的访问,还要做到负载平衡。这时候就不要使用多个这样的对象,因为每个对象都会和相同的server打交道。占用冗余资源当然浪费。所以,对server的访问最好集中到一个实例之中。
相关文章推荐
- Java Q&A: 使用Singleton模式?给我一个理由先!
- 给使用finally的使用一个理由
- 有没有一个不使用DBMS的理由?
- 给你一个放弃Eclipse的理由——IntelliJ IDEA使用
- 使用JSP + JAVABEAN + XML 开发的一个例子
- 在MFC下使用OpenGL的一个简单的例子
- 使用ADO操作数据库时一个好用的VARIANT类!
- 使用一个简单的webframe来解决EAI和分工合作问题
- Wuyin.ShoesManager.Start 程序源代码(包括只启动一个实例及使用XP控件技术)
- 我喜欢使用IntelliJ Idea的25个理由
- 在应用程序中将OJB作为一个存储层使用(二)
- 一个实际的OLE服务器的开发和使用
- 在应用程序中将OJB作为一个存储层使用(三)
- 在应用程序中将OJB作为一个存储层使用(六)
- 在应用程序中将OJB作为一个存储层使用(一)
- 不使用ATL向导,创建一个简单的ATL对话框程序.
- 使用ADSI、ASP和一对魔术戏法自动地创立一个虚拟目录的方法
- 怎样在一个一般窗口或是Dialog上面使用分割窗口.
- 源码推荐:一个使用C#绘制图形引擎的Framework
- 一个使用snap的Web应用