標籤:
單例模式介紹
單例模式(Singleton)顧名思義,是一種對象建立型模式,保證一個類只有一個執行個體,並提供一個訪問它的全域訪問點。為此,我們需要保證一個類只有一個執行個體並且這個執行個體易於被我們訪問,一個 全域變數使得一個對象可以被訪問,但他不能防止你執行個體化多個對象。如下面的全域對象的使用:
Dog類:
public class Dog{private String name; public Dog(String name) { System.out.println("Dog‘s name is "+name); }}
在另外一段代碼中聲明全域變數的對象dog:
public Dog dog = new Dog("Peter");
這樣並不能保證只有一隻狗這個對象存在。
一個更好的辦法是,讓類自身負責儲存它的唯一執行個體。這個類可以保證沒有其他執行個體可以被建立,並且它提供一個訪問該執行個體的方法。這就是單例模式。 單例模式的適用性
在下面情況下可以適用單例模式:
當類只有一個執行個體而且客戶可以從一個眾所周知的訪問點訪問它;
當這個唯一執行個體應該是通過子類化可擴充的,並且客戶應該無需更改代碼就能適用一個擴充的執行個體。
單例模式的設計方法
單例模式需要保證類的構造方法為私人的,即private修飾符,以保證外界不能執行個體化這個類的對象。
而且單例模式需要該類自身建立自己的靜態對象,並且需要定義一個getInstance()方法,即允許客戶訪問它的唯一執行個體。
單例模式的分類
單例模式分為餓漢模式和懶漢模式。餓漢模式是指在編譯時間自動建立對象,運行時直接調用即可,這種建立方法的優點是載入慢,運行快,並且具有執行緒安全性;懶漢模式是編譯時間不會建立對象,僅在客戶第一次訪問時才建立該對象,這種建立方法的優點則相反,載入快,運行慢,並且不具有執行緒安全性。
單例模式範例程式碼
首先我們來寫一個通用的餓漢模式程式模板:
package com.singleton.hangry;/** * 設計模式之單例模式 * 餓漢模式 * 載入慢,運行快,安全執行緒 * @author zzw * */public class HangryPattern {private HangryPattern() {System.out.println("單例模式之餓漢模式"+"\r\n"+"特點:載入慢,運行快,安全執行緒");}private static HangryPattern hangryPattern = new HangryPattern();public static HangryPattern getInstance() {return hangryPattern;}}
我們可以看到,上面代碼中僅有getInstance()方法為public static,即客戶只能調用此方法,此處我們為了通用性,不去關心單例的具體實現細節,接下來我們來寫一個客戶測試類別:
package com.singleton.hangry;public class Test {public static void main(String[] args) {HangryPattern hangryPattern = HangryPattern.getInstance();}}
同樣,我們來寫一個通用的懶漢模式程式模板:
package com.singleton.lazy;/** * 設計模式之單例模式 * 懶漢模式 * 載入快,運行慢,線程不安全 * @author zzw * */public class LazyPattern {private LazyPattern() {System.out.println("單例模式之懶漢模式"+"\r\n"+"特點:載入快,運行慢,線程不安全");}private static LazyPattern lazyPattern;public static LazyPattern getInstance() {if(lazyPattern == null) {lazyPattern = new LazyPattern();}return lazyPattern;}}
我們可以看到,上面代碼中僅有getInstance()方法為public static,即客戶只能調用此方法,並且,懶漢模式中僅在客戶第一次調用時才會建立。此處我們為了通用性,不去關心單例的具體實現細節,接下來我們來寫一個客戶測試類別:
package com.singleton.lazy;public class Test {public static void main(String[] args) {LazyPattern lazyPattern = LazyPattern.getInstance();}}
這樣我們就完成了餓漢模式和懶漢模式的模板代碼了,按照具體項目的實現細節,可以套用該模板代碼去應用單例設計模式。 單例設計模式的優點
最後,我們來總結一下單例設計模式的優點:
可以對唯一執行個體進行受控訪問;
能夠減少過多的變數聲明,這是對比儲存唯一執行個體的全域變數而得出的;
允許對操作和表示進行精細,Singleton類可以擁有子類,而且用這個擴充類的執行個體來配置一個應用是很容易的,此外,還可以用相同的方法來控制應用所使用的執行個體的數目。只有允許訪問Singleton執行個體的操作需要改變。
Java設計模式之單例模式