java设计模式--[創建模式]--单例模式[singleton pattern]

一. 單例: 確保一個類只有一個實例,并且提供一個全局訪問點


二. 單例模式的類中, 要有私有的構造器,一個靜態方法和一個靜態變量

 

三.示例如下:

 

    1. 經典的單例模式

 

package creationalPattern.singleton.singleton_1;
/**
 * 單例模式(延遲創建)
 * @author Liyongbin
 * @adte 2011-02-06
 *
 */
public class Singleton {
	//私有類成員(保存類的唯一實例)
	private static Singleton uniqueInstance;
	//私有構造器(只有Singleton類內才可以調用構造器)
	private Singleton(){};
	//全局訪問點(用getInstance()方法實例化對象,并返回實例)
	public static Singleton getInstance(){
		if (null==uniqueInstance) {
			uniqueInstance=new Singleton();
		} 
		return uniqueInstance;
	}
}

 注意: 此經典的單例實現,不適用于多線程環境;

 

2. 使用同步方法,解決單例的多線程問題

 

package creationalPattern.singleton.singleton_2;
/**
 * 單例模式(延遲創建)_支持多線程(使用同步方法)
 * @author Liyongbin
 * @adte 2011-02-06
 *
 */
public class Singleton {
	//私有類成員
	private static Singleton uniqueInstance;
	//私有構造器
	private Singleton(){};
	//全局訪問點
	public static synchronized Singleton getInstance(){
		if (null==uniqueInstance) {
			uniqueInstance=new Singleton();
		} 
		return uniqueInstance;
	}
}

 注意: 如果你總是頻繁地創建(getInstance()) 單例的話,以上方法就不適用了,可以採取以下方法;

 

3. 非延遲單例模式

 

package creationalPattern.singleton.singleton_3;
/**
 * 單例模式(非延遲(eagerly)創建)
 * @author Liyongbin
 * @adte 2011-02-06
 *
 */
public class Singleton {
	//私有的類成員
	private static Singleton uniqueInstance=new Singleton();
	//私有的構造器
	private Singleton(){};
	//全局的訪問點
	public static Singleton getInstance(){
		return uniqueInstance;
	}
}

 

4. 使用雙重檢查來確保單例的安全,高效運行

 

package creationalPattern.singleton.singleton_4;

/**
 * 單例模式((非延遲(eagerly)創建)使用雙重检查機制--volatile
 * 優化性能,大大地減少getInstance()時間耗費
 * @author Liyongbin
 * @adte 2011-02-06
 */
public class Singleton {
	//私有的類成員
	private volatile static Singleton uniqueInstance;
	//私有的構造器
	private Singleton(){};
	//全局的訪問點
	//检查实例,不存,就進入同步塊
	public static Singleton getInstance(){
		//只有第一次才徹底執行這里的代碼
		if (null==uniqueInstance) {
			synchronized (Singleton.class){
				//進入同步塊后,再檢查一次,為null才創建實例
				if (null==uniqueInstance) {
					uniqueInstance=new Singleton();
				}
			}
		}
		return uniqueInstance;
	}
}

 注:此方法僅適用于JDK1.4或更高的版本
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值