设计模式 - 单件模式(singleton pattern) 详解

单件模式(singleton pattern) 详解

 

本文地址: http://blog.csdn.net/caroline_wendy/article/details/28595349

 

单件模式(singleton pattern) : 确保一个类只有一个实例, 并提供一个全局访问点.

单价模式包括3个部分: 私有构造器, 静态变量, 静态方法.

 

具体方法:

1. 标准的单例模式:

 

/**
 * @time 2014.6.5
 */
package singleton;

/**
 * @author C.L.Wang
 *
 */
public class Singleton {
	private static Singleton uniqueInstance; //静态变量
	
	private Singleton() {} //私有构造函数
	
	public static Singleton getInstance() { //静态方法
		if (uniqueInstance == null)
			uniqueInstance = new Singleton();
		return uniqueInstance;
	}

}


2. 考虑多线程的三种方法:

 

同步(synchronized)方法, 添加"synchronized",  会导致性能下降, 每次调用示例, 都需要同步, 但是使用简单.

 

/**
 * @time 2014.6.5
 */
package singleton;

/**
 * @author C.L.Wang
 *
 */
public class Singleton {
	private static Singleton uniqueInstance; //静态变量
	
	private Singleton() {} //私有构造函数
	
	public static synchronized Singleton getInstance() { //静态方法
		if (uniqueInstance == null)
			uniqueInstance = new Singleton();
		return uniqueInstance;
	}

}

 

 

 

 

 

急切(eagerly)方法, 开始时创建实例, 会在不需要时, 占用实例空间, 即占用空间时间过长.

 

/**
 * @time 2014.6.5
 */
package singleton;

/**
 * @author C.L.Wang
 *
 */
public class Singleton {
	private static Singleton uniqueInstance = new Singleton(); //静态变量
	
	private Singleton() {} //私有构造函数
	
	public static synchronized Singleton getInstance() { //静态方法
		//if (uniqueInstance == null)
			//uniqueInstance = new Singleton();
		return uniqueInstance;
	}

}


双重检查加锁(double-checked locking)方法, 使用"volatile"和"synchronized (Singleton.class)", 减少时间消耗, 适用于java1.4以上版本.

 

 

/**
 * @time 2014.6.5
 */
package singleton;

/**
 * @author C.L.Wang
 *
 */
public class Singleton {
	private volatile static Singleton uniqueInstance; //静态变量
	
	private Singleton() {} //私有构造函数
	
	public static synchronized Singleton getInstance() { //静态方法
		if (uniqueInstance == null) {
			synchronized (Singleton.class) {
				if (uniqueInstance == null)
					uniqueInstance = new Singleton();
			}
		}
		return uniqueInstance;
	}

}


3. 使用单件模式的例子:

 

代码:

 

/**
 * @time 2014.6.5
 */
package singleton;

/**
 * @author C.L.Wang
 *
 */
public class ChocolateBoiler { //巧克力锅炉
	private boolean empty;
	private boolean boiled;
	
	public static ChocolateBoiler uniqueInstance; //静态变量
	
	private ChocolateBoiler() { //私有构造函数
		empty = true;
		boiled = false;
	}
	
	public static ChocolateBoiler getInstance() { //静态方法
		if (uniqueInstance == null) 
			uniqueInstance = new ChocolateBoiler();
		return uniqueInstance;
	}
	
	public void fill() { //填满
		if (isEmpty()) {
			empty = false;
			boiled = false;
		}
	}
	
	public void drain() { //倾倒
		if (!isEmpty() && isBoiled())
			empty = true;
	}
	
	public void boil() { //煮
		if (!isEmpty() && !isBoiled()) {
			boiled = true;
		}
	}
	
	public boolean isEmpty() {
		return empty;
	}
	
	public boolean isBoiled() {
		return boiled;
	}

}

 

4. 枚举单件(enum singleton)模式, 也可以保证线程安全.

 

代码:

 

/**
 * @time 2014.6.5
 */
package singleton;

/**
 * @author C.L.Wang
 *
 */
public class EnumSingleton {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

		eSingleton d1 = eSingleton.INSTANCE;
		d1.setName("Spike");
		
		eSingleton d2 = eSingleton.INSTANCE;
		d2.setName("Caroline");
		
		System.out.println(d1);
		System.out.println(d2);
		
		System.out.println(d1 == d2);
	}

}

enum eSingleton {
	
	INSTANCE;
	
	private String name;
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	@Override
	public String toString() {
		return "[" + name + "]";
	}
}


输出:

 

 

[Caroline]
[Caroline]
true

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ElminsterAumar

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值