簡介 在軟體開發過程中,會遇到很多重覆性的地方,設計模式就是開發前輩將一點一點開發經驗整合成便於他人重覆使用、高效率的代碼模板。學習開發人員使用設計模式開發能大大提高開發效率。從而使得代碼的可維護性、健壯性提高。 單例模式 單例模式要求類只能創建唯一的一個實例。一般情況下,構造器在訪問許可權類型都是公 ...
簡介
在軟體開發過程中,會遇到很多重覆性的地方,設計模式就是開發前輩將一點一點開發經驗整合成便於他人重覆使用、高效率的代碼模板。學習開發人員使用設計模式開發能大大提高開發效率。從而使得代碼的可維護性、健壯性提高。
單例模式
單例模式要求類只能創建唯一的一個實例。一般情況下,構造器在訪問許可權類型都是公有的,如果是private的,外界是無法依靠該類隨意創建實例的。單例就是利用這個特性,先在內部創建一個該類唯一的實例,並且我們知道靜態方法能通過類直接調用,利用這一特性,在類內部提供一個靜態方法返回該類的唯一實例,這樣外界就只能通過該方法獲得這個實例。
飽漢式(沒調用也一直在)
1 class singleTone { 2 3 private static final singleTone Instance=new singleTone(); 4 5 private singleTone(){}; 6 7 public static singleTone getInstance(){ 8 return Instance; 9 } 10 }
class singleTone1{ private static singleTone1 instance; static{ instance=new singleTone1(); } private singleTone1(){}; public static singleTone1 getInstance(){ return instance; } }
該模式的缺點:由於是靜態方法提供實例,如果沒有外界調用,則會浪費記憶體資源
懶漢式(不調用就不生產)
class singleTone3{ private static singleTone3 instance; private singleTone3(){}; public static synchronized singleTone3 getInstance(){ if(instance==null){ instance=new singleTone3(); } return instance; } }
class singleTone4{ private static singleTone4 instance; private singleTone4(){ }; public static singleTone4 getInstance(){ if(instance==null){ synchronized (singleTone4.class) { instance =new singleTone4(); } } return instance; } }
在併發編程環境下,就需要同步來提高程式的安全性,然而同步提高安全的辦法(不管是方法上加synchronized,還是加同步塊)會大大降低程式的效率
,要解決這種問題就需要雙重檢查
class singleTone5{ private static singleTone5 instance; private singleTone5(){}; public static singleTone5 getInstance(){ if(instance==null) synchronized (singleTone5.class) { if(instance==null){ instance=new singleTone5(); } } return instance; } }
兩次判斷,既是線程安全也是延遲載入,而且提高了效率。
如此比較主要滿足上訴優點,靜態的內部類也可以做到。
class singleTone6{ private singleTone6(){}; private static class single{ private static final singleTone6 instance=new singleTone6(); } public static singleTone6 getInstance(){ return single.instance; } }