三、單例模式(Singleton Pattern)

1. 什麼是單例模式

單例模式屬於創建者模式,一個類只有一個全局實例
在這裏插入圖片描述

2. 單例模式的角色組成

只有一個角色,就是單例角色本身

3. 代碼示例

單例模式有兩種加載模式:懶漢式創建實例,餓漢式創建實例

  • 懶漢式創建實例
package com.lt.patterns.singleton;

/**
 * 單例模式-懶漢式創建單例:在第一次使用時創建實例(適合耗費系統資源較大,使用頻率較低的實例創建)
 * @author lt
 * @date 2019年4月15日
 * @version v1.0
 */
public class SingleInstance_lazzy {

	/**
	 * 使用volatile修飾保證instance在所有線程中同步,並且可以保證線程安全
	 */
	private static volatile SingleInstance_lazzy instance = null;
	
	/**
	 * private修飾,避免在外部被調用
	 */
	private SingleInstance_lazzy(){
		System.out.println("SingleInstance_lazzy單例被創建");
	}
	
	/**
	 * volatile,synchronized保證線程安全,可以在多線程中使用;但是每次訪問會加鎖,同步,消耗額外的系統資源
	 * @author lt
	 * @date 2019年4月15日
	 * @return
	 */
	public static synchronized SingleInstance_lazzy getInstance(){
		System.out.println("SingleInstance_lazzy開始創建單例");
		if(instance==null){
			instance = new SingleInstance_lazzy();
		}
		return instance;
	}
}
  • 餓漢式創建實例
package com.lt.patterns.singleton;

/**
 * 單例模式-餓漢式創建實例:在類加載時創建實例(適合使用頻繁,耗費系統資源較少的實例創建)
 * @author lt
 * @date 2019年4月15日
 * @version v1.0
 */
public class SingleInstance_hungary {

	private static final SingleInstance_hungary instance = new SingleInstance_hungary();
	
	private SingleInstance_hungary(){
		System.out.println("SingleInstance_hungary單例被創建");
	}
	
	public static SingleInstance_hungary getInstance(){
		System.out.println("SingleInstance_hungary開始創建單例");
		return instance;
	}
}
  • 客戶端
package com.lt.patterns.client;

import org.junit.Test;

import com.lt.patterns.singleton.SingleInstance_hungary;
import com.lt.patterns.singleton.SingleInstance_lazzy;

/**
 * 單例模式
 * @author lt
 * @date 2019年4月15日
 * @version v1.0
 */
public class Client {

	@Test
	public void test1(){
		SingleInstance_hungary.getInstance();
	}
	
	@Test
	public void test2(){
		SingleInstance_lazzy.getInstance();
	}
}

4. 單例模式的特點

  • 可以節省系統開銷,共享對象,加快對象的訪問速度
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章