随笔 - 55  文章 - 187  trackbacks - 0
<2008年1月>
303112345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(12)

随笔分类

随笔档案

groovy

搜索

  •  

最新评论

阅读排行榜

评论排行榜

关于这个问题,下面是一些同仁的观点:

观点一:(单例
单例模式比静态方法有很多优势:
首先,单例可以继承类,实现接口,而静态类不能(可以集成类,但不能集成实例成员);
其次,单例可以被延迟初始化,静态类一般在第一次加载是初始化;
再次,单例类可以被集成,他的方法可以被覆写;
最后,或许最重要的是,单例类可以被用于多态而无需强迫用户只假定唯一的实例。举个例子,你可能在开始时只写一个配置,但是以后你可能需要支持超过一个配置集,或者可能需要允许用户从外部从外部文件中加载一个配置对象,或者编写自己的。你的代码不需要关注全局的状态,因此你的代码会更加灵活。

观点二:(静态方法

静态方法中产生的对象,会随着静态方法执行完毕而释放掉,而且执行类中的静态方法时,不会实例化静态方法所在的类。如果是用singleton,   产生的那一个唯一的实例,会一直在内存中,不会被GC清除的(原因是静态的属性变量不会被GC清除),除非整个JVM退出了。这个问题我之前也想几天,并且自己写代码来做了个实验。

观点三:(Good!
由于DAO的初始化,会比较占系统资源的,如果用静态方法来取,会不断地初始化和释放,所以我个人认为如果不存在比较复杂的事务管理,用singleton会比较好。个人意见,欢迎各位高手指正。  

抛砖引玉,请不吝赐教!

--------------------

    WE准高手
posted on 2008-01-22 10:46 大卫 阅读(20132) 评论(11)  编辑  收藏 所属分类: Java

FeedBack:
# re: 采用单例模式还是静态方法? 2008-01-22 11:25 久城
我的理解:
先区分类与对象的概念。
类就象是一个模板,一个对象就是这个模板的一个实例。

1.单例模式与静态方法:
单例模式只是一种模式,强调某一个实例是唯一的。
静态方法是基于类的方法,与对象没有必然联系。

2.单例类与静态类
单例类就是采用单例模式的类,单例类强调用它构建的实例是唯一的。(基于对象的唯一)
静态类就是所有的属性和方法都是静态的类,强调该类的所有属性和成员都是基于类的,而不是基于某一个对象的。(基于类的唯一)  回复  更多评论
  
# re: 采用单例模式还是静态方法? 2008-01-22 11:31 rocket
为什么不用spring管理你的DAO??
还好进行TDD。呵呵  回复  更多评论
  
# re: 采用单例模式还是静态方法?[未登录] 2008-01-22 14:06 dennis
搞不明白单例模式与静态方法需要比较什么?什么是静态类?概念混淆,逻辑不清  回复  更多评论
  
# re: 采用单例模式还是静态方法? 2008-01-22 16:03 大卫
@dennis
其实,这个题目不是我写的,只是心中有疑问,看到晚上有此讨论,就粘贴上了。我的意思是想问,对于工具类,用一个实例实现和用静态类实现的优劣。
其实你也应该知道我要说的是什么问题。请帮忙谈谈你的理解吧。谢谢!  回复  更多评论
  
# re: 采用单例模式还是静态方法? 2008-01-23 09:39 隔叶黄莺
其次,单例可以被延迟初始化,静态类一般在第一次加载是初始化;

什么是静态类,静态类的概念直接理解就是 static class,而这种写法大概只会出现在一个类的内部类中;但是从楼主的讨论指的应该都是指的静态方法。即使是说的静态类,也有延迟加载的特性,并不会在JVM一起来就加载,会待到它所属类加载时加载,所以延迟性没有区别的。

静态方法中产生的对象,会随着静态方法执行完毕而释放掉,
无论是实例方法还是类的方法,方法中的对象都是局部对象,在方法返回后都会释放。  回复  更多评论
  
# re: 采用单例模式还是静态方法? 2008-01-27 07:56 小雨
这个问题我也思考了一段时间。

我现在的想法是这样的:如果一个类不需要扩展,就使用静态方法类,当然也可以使用单例,只是用单例的话写起来麻烦,使用哪个,决定权在你手上。
如果是个需要扩展的类,那就最好使用单例了,因为用静态方法类的话,在代码中都是这么使用的 SomeClass.doSomething(),当这个SomeClass类需要扩展的时候,比如你用一个SubClass继承了SomeClass,项目中的代码都需要改成SubClass.doSomething()的话,需要改非常多的地方。如果一开始使用的是单例类,你一开始使用SomeClass的时候是这么写的:SomeClass sc = SomeClass.getInstance();,后面都调用sc.doSomething();,当你需要替换成SubClass的时候只要改掉声明部分:SomeClass sc = SubClass.getInstance();。

DAO我认为还是用单例比较好。至于你说的占资源,其实单例类和静态方法类是一样的。你应该先搞清楚一个类无论有多少个实例,它所含有的方法代码只会出现在内存中一次而已。只要你的这个DAO没有成员变量,无论你实例化多少次,占用的内存是几乎不变的。

这里有一个CSDN上2004年的老帖子:
http://topic.csdn.net/t/20040427/12/3012555.html  回复  更多评论
  
# re: 采用单例模式还是静态方法?[未登录] 2012-06-25 11:38 过客
@dennis
你懂什么,单例和静态方法带来的效果,都是一个类一个实例。这是他们的相同点。不懂就不要喷别人。
请对别人保持尊重  回复  更多评论
  
# re: 采用单例模式还是静态方法? 2013-01-20 20:42 
@小雨
单例类无法被扩展  回复  更多评论
  
# re: 采用单例模式还是静态方法? 2013-06-25 11:49 ShuXiaolong
@久城
说真的,你的 理解 真的没有 实战意义。

单例 还是 静态 都可以实现相同的代码 功能:
在 内存开销,CPU速度,线程安全 上 基本持平。

其实,很多时候 选择用 单例 和 静态 完全取决于 程序为 维护成本。

单例 最大的优势 是 可以进行继承,多态。
静态类 可能 看起来 清爽一点。

————————————
对于 “强调某一个实例是唯一的” “与对象没有必然联系”
——这种理解 真没有 理论 与 实战 的价值。

【设计模式 不能仅停留在 代码怎么写
—— 而要理解 设计模式可以做到什么:减少代码,增加稳定,方便理解,提升性能,减少开销】

  回复  更多评论
  
# re: 采用单例模式还是静态方法? 2015-06-16 13:53 老学生
@久城
没实际经验不要上来误导别人,背会概念不代表你能解决实际问题.
你在实际工程中都使用过吗?比如一个常用工具类,是简单静态方法的集合呢还是做个唯一实例?哪种用起来效率高?在现今机器条件下占用内存可不考虑,但要考虑内存垃圾对GC的影响,除非缓存数十万条数据  回复  更多评论
  
# re: 采用单例模式还是静态方法? 2015-06-16 13:54 老学生
@rocket
spring一般用的就是单例模式去加载。不一定是最好,只是为了方便那些不善于管理类加载的人进行大规模协作  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问