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. 單例模式的特點
- 可以節省系統開銷,共享對象,加快對象的訪問速度