qileilove

blog已经转移至github,大家请访问 http://qaseven.github.io/

singleton模式

这个单例模式一般是只能创建一个实例的实现,如网络游戏里每个特定的地图,对于任意一个玩家,这个地图都是唯一的. 其特点是有一个私有的构造器和一个公开的获取实例的方法。比如:

//这是第一种,叫饿汉模式,无论是否需要,都弄一个出来


public class Singleton{
 private static final Singleton st=new Singleton();
 private Singleton(){
 
 }
 public static Singleton getInstance(){
  if(st==null)
  {
    return st;

  }
 }
}

//这是另外一种,叫懒汉模式,你不要我就不给弄,你要了再说.

public class SingleTon{
 private static SingleTon st;
 private SingleTon(){

 }
 public static SingleTon getInstance(){
   if (st==null){
     st=new SingleTon();
   }
   return st;
  }
}

二者在大多数情况没区别,但是饿汉模式是线程安全的,懒汉模式是要加同步锁的.不同步的话,在这个类的实例还没有创建的时候,多个线程同时去调用getInstance, 这时,由于没有同步锁,有可能会创建出多个实例来。 
对于饿汉式,由于实例是在load class的时候创建的,所以就没有这个问题。 当然,除非2个线程采用了不同的class loader. 
当然, 无论饿汉还是懒汉, 几率都不高, 但几率低不代表不会出错, 逻辑上也不对, 因此, 编程者还是应该避免。 
package test;

public class Singleton {
 private Singleton s;
 private Singleton()
 {
  
 }
 public static Singleton getSigleton()
 {
  if(s==null)s=new Singleton();
  return s;
 }

 
}
这就是一个单例模式,我想应该不用注释了,原理就是这个类的构造方法private了,所有在外边不能调用,也就不能new Singleton();得到实例,那么
想得到实例就得调用它的静态方法getSigleton();即Singleton.getSigleton();就会返回一个Singleton的实例,注意此方法中的语句,
即如果你是第一次调用这个方法那么它会给你new一个实例,以后再调用得到的都是这个实例,也就是说从始至终就只有一个Singleton的实例,这就是单例模式。
1、禁止掉可被调用的构建方法
2、自动初始化一个实例
public class EagerSingleton{
  private static final EagerSingletonst = new EagerSingleton();
  private EagerSingleton(){}
  public static EagerSingletongetInstance(){
    return st;
  }
}

public class LazySingleton{
  private static LazySingletonst;
  private LazySingleton(){}
  synchronized public static LazySingleton getInstance(){
    if (st==null){
      st = new LazySingleton();
    }
    return st;
  }
}


EagerSingleton比较适合JAVA 

posted on 2011-09-23 11:29 顺其自然EVO 阅读(139) 评论(0)  编辑  收藏

<2011年9月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

导航

统计

常用链接

留言簿(55)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜