单例模式static的困惑
但这样我感觉很多都应该设计成单例,因为一般的都是以方法传参数然后执行出结果。这样的话不涉及到对象状态的问题。
状态问题只涉及到实例对象或类对象的情况。对于局部变量都会有一个复本。这是不存在对象状态的问题的(我的理解)。
但JAVA编程思想上说static用多了就应该考虑你的设计是否有问题了。感觉有些矛盾。大家谈谈是否应该在service层,dao层多多使用单例呢?或者是不是应该多使用静态方法呢???
[该贴被leoyu于2007年05月23日 12:15修改过]
但对于大的对象,我还是认为在之初就初始化好这样是个不错的方案
[该贴被leoyu于2007年05月23日 19:50修改过]
关键点是:单例模式和static是两码事情,单例模式可以使用static实现,也可以不由其实现。
>那可能对象多了,单例在内存中就占了20M(假如,也许更多),那这样是得不到释放的,
这个现象是针对static而言的。我们可以让一个对象在内存是单例,但是当这样对象多了的时候,也可以释放,被GC清除。
这就涉及容器概念,也就是说,我们将这些对象单例用一个容器包容,不是直接将这些单例放到JVM,而是放到一个容器中,这个容器再放到JVM中;如果我们消灭这个容器对象,那么其中的单例对象就会被GC回收。
这个时候,单例概念已经不是原来JVM单例概念,这个单例是一定范围(时间或空间)内的单例,实际等同于对象的scope。
类似Spring/jdonFramework这样框架,就是引入了这样一个容器,如果我们将这个容器对象scope设置为Web的Application级别,也就是说,在某个Web项目中,这个容器是唯一的,那么容器中的单例对象也就是唯一。如果我们Web项目不再部署,退出,容器对象生命周期结束,其中所有单例对象生命周期也就结束。
注意:虽然我们变通了单例的生命周期,但是在单例有生命时段内,如果多个线程访问(写操作)单例中的状态,那么就有数据不一致问题,好事人如果在这个单例对状态访问操作加上同步锁,那么就可能将多线程的J2EE/JavaEE应用变成单线程。
所以,如果我们的服务或DAO都是无状态的,那么使用单例没有问题,但是谁能保证程序代码不修改,如果来个鲁莽的小伙子,将你的服务改成有状态,那么就出现很多奇怪问题了。
当然,如果你有一个称不上好习惯的习惯,不喜欢在类的字段中保存数据,什么都依赖数据库,那么使用单例也会一直没有问题,但是这种习惯是OO的吗?高负载下性能会好吗?这又涉及另外问题了。
所以,养成用多例Pool来支持你的服务,不失为一个克服上面的两全其美的好办法,但是POOL也有小的性能开销。
其实绕来绕去,我们发现:当初我们使用EJB时的最大困惑:有态和无态的选择,在Spring/jdonFramework中不是被消灭了,而是被转移了,表面简化了,但是这个问题永远回避不了。
[该贴被banq于2007年05月24日 15:56修改过]
这里还请教一个问题,在JDON泡了这么久了,见BANQ大力推荐以设计模式+领域模型为出发点的DDD开发.在平常的时间里看设计模式还能看懂,但在实际应用中,确有想不出来在哪儿用设计模式,怎么用设计模式的问题.领域驱动设计这本书我看了下,看不大明白,不知是先看完设计模式再看领域模型呢还是先看领域模型再看设计模式.
以前没用开源框架前是古老的JSP+Servlet+JavaBean的MVC开发.现在用struts spring hibernate也有一段时间了,感觉都是一些框架应用上的问题.还是对软件构架,分析这块有更多的兴趣.希望BANQ能为我们只明一条比较适用的学习路线啊.感谢!
[该贴被leoyu于2007年05月29日 23:05修改过]
关于POOL相关话题:
Flyweight模式之我见
http://www.jdon.com/jivejdon/thread/31903.html
[该贴被banq于2007年06月05日 12:12修改过]