设计模式之单例模式

单例模式顾名思义,一个类只允许有一个实例,因而只能创建一次,之后访问返回的都是第一次创建的实例。因为不能随意创建,单例类的构造方法都是私有的,只能通过静态方法来获取实例。

单例模式分为饿汉模式和懒汉模式,区别在于创建实例的时机不同:饿汉模式在类初始化的时候创建;懒汉模式在调用获取实例方法时创建。

1. 懒汉模式(Lazy)

public class LazySingleton {
	private static LazySingleton singleton;

	private LazySingleton() {
	}

	public static LazySingleton getInstance() {
		if (singleton == null) {
			singleton = new LazySingleton();
		}
		return singleton;
	}
}

采用懒加载的方式:在需要的时候再创建实例,但上面的实现不是线程安全的,需要采用二重检查来保证线程安全。

public class LazySingleton {
	private static LazySingleton singleton;

	private LazySingleton() {
	}

	public static LazySingleton getInstance() {
		if (singleton == null) {
			synchronized (LazySingleton.class) {
				if (singleton == null) {
					singleton = new LazySingleton();
				}
			}
		}
		return singleton;
	}
}

2. 饿汉模式

public class HungrySingleton {

	private static HungrySingleton singleton = new HungrySingleton();

	private HungrySingleton() {
	}

	public static HungrySingleton getInstance() {
		return singleton;
	}
}

在类初始化的时候创建实例,之后获取到的实例都是第一次所创建的,天然线程安全。缺点在于,无论你是否需要创建实例,都会在类初始化的时候创建。

3. 匿名内部类实现

public class InnerClassSingleton {

	private InnerClassSingleton() {
	}

	private static class InnerClass {
		public static InnerClassSingleton singleton = new InnerClassSingleton();
	}

	public static InnerClassSingleton getInstance() {
		return InnerClass.singleton;
	}

}
在内部类初始化的时候创建实例,与饿汉模式的区别在于可以控制内部类初始化的时机:只有在调用getInstance方法时才会初始化内部类,以达到懒加载的效果。同样,因为是类初始化的时候创建,天然的线程安全。
阅读更多
个人分类: 设计模式
上一篇设计模式之装饰者
下一篇设计模式之观察者
想对作者说点什么? 我来说一句

java 设计模式 单例模式

2012年03月16日 2KB 下载

研磨设计模式单例模式.pdf

2011年11月16日 311KB 下载

设计模式——单例模式

2011年04月16日 39KB 下载

设计模式单例模式

2016年01月05日 258KB 下载

ActionScript3.0设计模式第一部分

2011年02月10日 14.31MB 下载

ActionScript3.0设计模式第二部分

2011年02月10日 12.24MB 下载

单例模式.doc

2016年12月14日 21KB 下载

没有更多推荐了,返回首页

关闭
关闭