模式例子逐步完善,參考完整代碼在GitHub
地址:https://github.com/ZhangXiaoixiang/patter23
1單例模式(餓漢式)
package com.demo.patter01;
/**
* SingletonDemo1
* 測試餓漢式單例模式
* @author 10905 2018/12/23
* @version 1.0
*/
public class SingletonDemo1 {
/**
* 1 類初始化時,立即加載這個對象(沒有延時加載的優勢)。加載類時,天然的是線程安全的.這裏使用的private封裝對象(主要是安全層面的訪
* 問修飾符,和一般的屬性封裝爲private是一樣的,沒有什麼特別的意思)
* static修飾是爲了實例化對象的時候的方便使用類名.方法名的方式得到這個類的單例對象
*/
private static SingletonDemo1 instance=new SingletonDemo1();
/**
* 2 私有構造器(在本類的如果要繼續new對象可以,private,public修飾構造器沒有區別,但是外部調用該類,必須使用private修飾以防止外部
* new出新對象,所以這裏必須是private修飾構造器)
*/
private SingletonDemo1() {
}
/**
* 3 公開調用方法,方法沒有同步,調用效率高!(必須要提供給外部一個方法創建這個類的單例(唯一)對象的方法,因爲第一步static修飾類屬性的
* (就是一個對象),所以這裏也必須使用static修飾返回的對象)
*/
public static SingletonDemo1 getInstance(){
return instance;
}
/**
* 這是在本類測試,所以上面的化構造器即使是private修飾爲私有的,但是在本類仍然可以使用構造器new對象,所以我這裏寫的main方法主要是爲了
* 加深對構造器爲什麼要私有化的理解二特意在這裏的,
* 當然,要測試單例,應該在另一個類中寫個main方法測試(或者junit測試)
* @param args
*/
public static void main(String[] args) {
SingletonDemo1 instance = SingletonDemo1.getInstance();
System.out.println(instance);
SingletonDemo1 instance1 = SingletonDemo1.getInstance();
System.out.println(instance1);
/**
* 構造器私有化了,爲什麼仍然可以new的原因是因爲這個main方法寫在了單例類的內部,當然可以使用構造器(故意寫在這裏的)
*/
SingletonDemo1 singletonDemo1=new SingletonDemo1();
SingletonDemo1 singletonDemo2=new SingletonDemo1();
System.out.println(singletonDemo1);
System.out.println(singletonDemo2);
/**
* 說明:instance和instance1肯定是一個對象,但是singletonDemo1和singletonDemo2不是一個對象了
*/
}
}
單例模式(懶漢式)
package com.demo.patter01;
/**
* SingletonDemo2
* 測試懶漢式單例模式 優點:延時加載 缺點:調用效率低
* @author 10905 2018/12/23
* @version 1.0
*/
public class SingletonDemo2 {
/**
* 類初始化時,不初始化這個對象(延時加載,真正用的時候再創建)。
*/
private static SingletonDemo2 instance;
/**
* 私有化構造器
*/
private SingletonDemo2(){
}
/**
* 方法同步,調用效率低!
* 我的解釋:爲什麼需要synchronized同步了?因爲懶加載類初始化的時候沒有及時new對象,所以試想一下,多個地方使用該類,
* 但是生成實例的時間點不一樣,如果不同步,那麼久保證不了單例,並且線程不安全
*/
public static synchronized SingletonDemo2 getInstance(){
if(instance==null){
instance = new SingletonDemo2();
}
return instance;
}
}
單例模式(靜態內部類)
package com.demo.patter01;
/**
* SingletonDemo4
* 測試靜態內部類實現單例模式 (推薦使用)
* 這種方式:線程安全,調用效率高,並且實現了延時加載!
* @author 10905 2018/12/23
* @version 1.0
*/
public class SingletonDemo4 {
/**
* 這是一個靜態內部類,可以發現並沒有立即加載該類,實現延遲加載的效果,直到調用才加載
*/
private static class SingletonClassInstance {
/**
* static可以加final修飾,但是其實沒有必要
*/
private static SingletonDemo4 instance = new SingletonDemo4();
}
/**
* 構造器私有化
*/
private SingletonDemo4(){
}
/**
* 方法沒有同步,調用效率高!,調用的時候纔去靜態內部類new對象,實現延時加載
*/
public static SingletonDemo4 getInstance(){
return SingletonClassInstance.instance;
}
}