这个单例模式一般是只能创建一个实例的实现,如网络游戏里每个特定的地图,对于任意一个玩家,这个地图都是唯一的. 其特点是有一个私有的构造器和一个公开的获取实例的方法。比如:
//这是第一种,叫饿汉模式,无论是否需要,都弄一个出来
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