创建型模式(五):Singleton(单例模式)

单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例单例模式。单例模式只应在有真正的“单一实例”的需求时才可使用。

 1 class Singleton {
2 private static Singleton sing;
3
4 private Singleton() {
5 }
6
7 public static Singleton getInstance() {
8 if (sing == null) {
9 sing = new Singleton();
10 }
11 return sing;
12 }
13 }
14
15 public class Test {
16 public static void main(String[] args) {
17 Singleton sing = Singleton.getInstance();
18 Singleton sing2 = Singleton.getInstance();
19 System.out.println(sing);
20 System.out.println(sing2);
21 }
22 }

不过这样的单例模式似乎有些问题,在多线程并发的情况下,if(sing=null)的判断上还是有可能出现两个单例的情况,所以为避免万一,最好还是改成:

1 class Singleton{
2 private Singleton(){}
3 private static Singleton sing=new Singleton();
4 public static Singleton getInstance(){
5 return sing;
6 }
7 }


还有更牛X的方法进行单例~

使用枚举:

enum Singleton{
sing;
//方法
public void test(){
System.out.println("singleton");
}
}

因为枚举默认每个都是单例

 

以为结束了吗?不~使用静态内部类:

class Singleton{
private static class SingletonInner{
private static Singleton sing=new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return SingletonInner.sing;
}
}

这样用的好处在于可以在类在装载的时候并没有创建这个单例,而在真正使用的时候才去调用内部类去创建这个单例



 
posted @ 2011-12-07 21:42  一直在等  阅读(409)  评论(0编辑  收藏  举报