论坛首页 入门技术论坛

java关于单例模式的一些疑问?

浏览 15037 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-04-12  
各位大侠说的够明白了,偶就不多说了,想必也应该明白了吧
0 请登录后投票
   发表时间:2009-04-12  
spring 的config里就有很多用Singlenon
0 请登录后投票
   发表时间:2009-04-12  
一般singleton是用下面的写法,和楼主的写法区别在于,线程安全性,是用jvm来保证的

public class SingleTon
{
private SingleTon()
{

}

public static SingleTon getInstance()
{
return Holder.singleTon;
}
private static class Holder{
private static SingleTon singleTon=createSingleTon();

private static SingleTon createSingleTon(){
//工厂方法,可以做一些你需要的初始化
return new SingleTon();
}
}

//.....其它的方法。。。。。。。
}

1.这里的私有构造方法SingleTon()是为了防止客户端程序员非法实例化SingleTon类。(只能用getInstance()方法取得SingleTon类)

2.采用Holder类,是为了得用jdk对static变量的定义来保证多线程安全。

3.当你需要singleton的时候,就按这个写法就可以了,这个是很多人,很多时间精炼出来的singleton写法,其它的方法不用知道。

4.当你的系统,只需要有一个实例的时候才用singleton。比如说,你的配置参数类。你只需要在你系统初始化的时候,生成一个类就可以了,在需要用的地方,只要调用一下getInstance()。
0 请登录后投票
   发表时间:2009-04-13  
JDK1.5以后还有一种写法,就是把这个单例的直接写成enum。这样也能保证单例
0 请登录后投票
   发表时间:2009-04-13  
showtime520 写道
JDK1.5以后还有一种写法,就是把这个单例的直接写成enum。这样也能保证单例

的确,据joshua bloch说,这是单例应用的最佳方法。
0 请登录后投票
   发表时间:2009-04-13  
所有的方法都是static,这种是最简单的单例。也是最有效的单例,呵呵。
0 请登录后投票
   发表时间:2009-04-13  
jansel 写道
所有的方法都是static,这种是最简单的单例。也是最有效的单例,呵呵。

谢谢关注!
0 请登录后投票
   发表时间:2009-04-13  
zhaobohao 写道

一般singleton是用下面的写法,和楼主的写法区别在于,线程安全性,是用jvm来保证的public class SingleTon{ private SingleTon() { } public static SingleTon getInstance() { return Holder.singleTon; } private static class Holder{ private static SingleTon singleTon=createSingleTon(); private static SingleTon createSingleTon(){ //工厂方法,可以做一些你需要的初始化 return new SingleTon(); } } //.....其它的方法。。。。。。。}1.这里的私有构造方法SingleTon()是为了防止客户端程序员非法实例化SingleTon类。(只能用getInstance()方法取得SingleTon类)2.采用Holder类,是为了得用jdk对static变量的定义来保证多线程安全。3.当你需要singleton的时候,就按这个写法就可以了,这个是很多人,很多时间精炼出来的singleton写法,其它的方法不用知道。4.当你的系统,只需要有一个实例的时候才用singleton。比如说,你的配置参数类。你只需要在你系统初始化的时候,生成一个类就可以了,在需要用的地方,只要调用一下getInstance()。

很详细!谢谢!
0 请登录后投票
   发表时间:2009-04-13   最后修改:2009-04-13
以单元素的枚举类型来实现单例总觉得有点怪怪的,
比如以下代码
import java.util.*;

public enum Catalog {
   soleInstance;

   private Map<String,Book> books = new HashMap<String,Book>();

   public void add(Book book) {
      books.put(book.getClassification(), book);
   }

   public Book get(String classification) {
      return books.get(classification);
   }

   //其他的一大堆的方法...
}

枚举内的方法少一点的话感觉看上去还算舒服,如果方法有6、7个之多,私有变量也很多,
因为习惯了通常的class方式,看这样的enum有点接受不了 ,不知道这样使用是否违背了引入enum的初衷
0 请登录后投票
   发表时间:2009-04-13  
单例 有没有想过用静态方法会怎么样?
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics