單例設計模式餓漢式和懶漢式的簡單實現(Java語言實現)
阿新 • • 發佈:2021-01-08
技術標籤:Java酬勤筆記java程式語言設計模式面試程式人生
單例設計模式餓漢式和懶漢式的簡單實現(Java語言實現)
單例設計模式介紹
什麼是單例設計模式:
所謂類的單例設計模式,就是採取一定的方法保證在整個軟體系統中,對某個類只能存在一個物件例項,並且只提供一個取得物件例項的方法。
實現原理:
要使類只能產生一個物件,首先,我們必須將類的構造器的訪問許可權設定為 private,,這樣我們就不能通過new關鍵字在外部多次建立物件了,但在類的內部我們仍可以產生該類的物件
因為在外部無法得到類的物件,我們只能提供一個 static關鍵字修飾過的靜態方法來提供訪問類內部建立的物件,而由於靜態方法只能訪問類中的靜態變數,所以我們內部的物件也必須定義成靜態的(有關static
說起來就這麼點東西了,接下來看看單例設計模式的兩種實現方式。
餓漢式單例模式
餓漢式單例模式介紹
顧名思義,餓漢式就是很餓,所以我們不管三七二十一,就把我們需要的那一個唯一的物件直接產生出來,然後加以封裝並提供呼叫的方法
程式碼實現
我們一步一步來,首先有一個叫Bank的類
public class Bank {
}
按照上面說的,我們需要一個private的構造器
public class Bank {
//private許可權的構造器
private Bank() {
}
}
接著我們自己內部產生一個唯一的靜態物件
public class Bank {
//private許可權的構造器
private Bank() {
}
//Bank的內部直接new一個Bank類的物件instance
private static Bank instance = new Bank();
//這個instance可以理解為Bank類的屬性之一了
}
因為這個靜態變數是外部無法訪問的,所以我們需要提供一個公開的方法來供外部使用instance變數
public class Bank {
//private許可權的構造器
private Bank() {
}
//Bank的內部直接new一個Bank類的物件instance
//這個instance可以理解為Bank類的屬性之一了
private static Bank instance = new Bank();
//提供一個public的方法來返回instance物件
public static Bank getInstance(){
return instance;//返回instance物件
}
}
其實到這裡一個簡單的餓漢式單例設計模式就寫完了,我們測試一下
public class SingletonTest {
public static void main(String[] args) {
Bank bank1=new Bank();//無法new物件,因為沒有許可權
bank1.getInstance;//更不用說通過物件呼叫方法了
}
}
我們只能直接通過類中我們提供的方法來檢視內部物件
public class SingletonTest {
public static void main(String[] args) {
System.out.println(Bank.getInstance());
}
}
執行結果:成功返回了物件的地址值
餓漢式的優缺點
- 優點:餓漢式是執行緒安全的
- 缺點:如果沒有第一時間使用,可能會浪費資源
懶漢式單例模式
懶漢式單例模式介紹
顧名思義,因為是懶漢式,所以很懶,只有在需要的時候才去動,及產生物件。
程式碼實現
因為相較於餓漢式差異不大,所以直接放上全程式碼
public class Bank {
//private許可權的構造器
private Bank() {
}
//類內部聲明瞭一個Bank變數,但並沒有new物件
private static Bank instance = null;
//提供外部使用的方法,第一次呼叫時若發現instance並不存在則new
//一個物件後再返回
public static Bank getInstance(){
if(instance == null){
instance = new Bank();
}
//當存在後,直接返回.
return instance;
}
}
懶漢式和餓漢式的唯一區別就在於,懶漢式在生成內部物件時,並沒有一開始就分配空間,而是等第一次真正使用時,才會去new一個物件。
懶漢式的優缺點
- 優點:需要的時候才建立,延遲物件的建立
- 但目前的懶漢式的實現是非執行緒安全的,需要完善。