Java Q&A: 使用Singleton模式?给我一个理由先!
2001-09-23 15:34
561 查看
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 LinkedList特有方法程序小解 && 使用LinkedList 模拟一个堆栈或者队列数据结构。
- 使用Singleton模式?给我一个理由先!
- 使用JSP + JAVABEAN + XML 开发的一个例子
- JDK1.5使用总结 --《Java 1.5 Tiger: A Developer's Notebook》
- 使用JSP + JAVABEAN + XML 开发的一个例子
- JAVA 使用哈希表操作数据库的例子 Using Hashtables to Store & Extract results from a Database.
- 使用JSP + JAVABEAN + XML 开发的一个例子
- 使用python为Java项目开发一个预编译脚本
- [Source Code]Java I/O --- ---使用dom读取一个xml文件的叶子节点的text content
- 介绍一个GWT的网站 和 decode javascript.encode using java +FCKEditor 在 jsp中的使用说明
- 使用流加载和保存HTML内容&遍历html的信息存入一个ini文件&使用MSHTML分析HTML代码
- 用java自制了一个图片大小转换器,欢迎使用
- Java Q&A: 使用Observer模式
- Java Q&A: 使用Factory Method模式
- 在启动脚本中一般使用类似如下的命令执行一个Java程序
- 使用Java将Word转为Html或txt等···
- 使用JSP + JAVABEAN + XML 开发的一个例子
- Java为什么不支持"无符号型基本数据"---一个无意中的发现!!
- 一个使用Java读取串口的程序
- 使用一个入侵测系统+主动防火墙-->Snort+Guardian (ZT)