标签:single 单例类 模式 null return 实例 art 术语 检查
对吗? 对不正确要看标准
单例模式(Singleton Pattern):确保某一个类仅仅有一个实例,并且自行实例化并向整个系统提供这个实例。
这个类称为单例类。它提供全局訪问的方法。单例模式是一种对象创建型模式。
看来我之前定义的不全对。
第一 保证类仅仅有一个实例
第二 类本身自己实例化(意思就是不能让别的类来new自己)
第三 提供全局訪问的方法
OK 那我如今写出第一种Singleton
public class Singleton{
private static Singleton sl;
private Singleton(){
System.out.println("初始化");
}
public static Singleton getInstance(){
if(sl==null)
sl=new Singleton();
return sl;
}
public static void main(String[] args){
Singleton sl=Singleton.getInstance();
Singleton sl2=Singleton.getInstance();
}
}执行结果是显示一个初始化所以有
/***
* 饿汉模式
*/
public class Singleton2{
private final static Singleton2 sl2=new Singleton2();
private Singleton2(){
System.out.println("初始化");
}
public static Singleton2 getInstance(){
return sl2;
}
public static void main(String[] args){
Singleton2 sl2=Singleton2.getInstance();
Singleton2 sl3=Singleton2.getInstance();
}
}这样的单例模式,我们在类载入的时候,就把类变量new出来。这样的方式我们称之为饿汉模式。
上面说了这个模式叫饿汉模式,那自然有非饿汉模式(术语叫懒汉模式)。只是在这里我不太想和大家聊懒汉模式,太复杂,且不怎么用。
那有没有一种单例,既能解决第一个的线程问题,同一时候保持性能(事实上另外一种饿汉模式就不错了,就那一个类,能拖多少性能?就算有10个,100个也不是太多)呢?并且也不像我说的那个"懒汉模式"那么复杂呢?
答案是肯定的。
有!
public class Singleton3{
private static class hold{
private final static Singleton3 sl3=new Singleton3();
}
private Singleton3(){
System.out.println("初始化");
}
public static Singleton3 getInstance(){
return hold.sl3;
}
public static void main(String[] args){
Singleton3 sl3=Singleton3.getInstance();
Singleton3 sl4=Singleton3.getInstance();
System.out.println(sl3==sl4);
}
}关于内部类与static,final的分析,我们这里临时不讲。
但也引出了一个不是问题的问题
内部类是java支持的,可是在别的语言中,不一定。
标签:single 单例类 模式 null return 实例 art 术语 检查
原文地址:http://www.cnblogs.com/wzjhoutai/p/6985436.html