目錄
單例設計模式說的是採取一定方法保證在整個軟體系統中,對某個類只能存在乙個物件例項,並且該類只提供乙個取得其物件例項的方法(靜態方法)。這是設計模式中最簡單的一種,沒準無意中就使用到過。
適用場景:
單例模式主要分為:
1)餓漢模式
2)懶漢模式
標紅為推薦使用的方式
餓漢模式是在類的載入的時候就建立乙個例項。餓漢模式又分兩種實現方式:
1)通過靜態常量實現
結論:這種單例模式可用,可能造成資源浪費,所以一般在確定一定會用到這個類時採用。
**示例
步驟如下:
1)構造器私有化(防止 new)
2)類的內部建立物件
3)向外暴露乙個靜態的公共方法。getinstance
class singleton
//2.本類內部建立物件例項
private final static singleton instance = new singleton();
//3.提供乙個公有的靜態方法,放回例項物件
public static singleton getinstance()
}
2)通過靜態**塊實現。
這種方式和上面的方式其實類似,只不過將類例項化的過程放在了靜態**塊中,也就是類**的時候,就執行靜態**塊中的**,初始化類的例項。優缺點和上面一樣
結論:這種單例模式可用,但是會造成資源浪費
**示例
1)構造器私有化(防止 new)
2)類的內部聲名靜態物件
3)在靜態**塊中,建立單例物件
4)提供乙個公有的靜態方法,放回例項物件
class singleton
static
public static singleton getinstance()
}
懶漢模式是在呼叫方法的時候進行例項化的工作。實現方式有六種:
1)執行緒不安全
優點:起到了懶載入的效果,但是只能在單執行緒下使用。
缺點:如果在多執行緒下,乙個執行緒進入了if(singletion == null)判斷語句塊,還未來得及往下執行,另乙個執行緒也通過了這個判斷語句,這時便會產生多個例項。所以在多執行緒環境下不可使用這種方式
結論:在實際開發中,不要使用這種方式(多執行緒環境下,執行緒不安全)
**示例
實現步驟
1)構造器私有化(防止 new)
2)類的內部聲名靜態物件
3)提供乙個靜態的公有方法,當使用到該方法時,才去建立 instance
class singleton
//提供乙個靜態的公有方法,當使用到該方法時,才去建立 instance
//即懶漢式
public static singleton getinstance()
return instance;
}}
2)執行緒安全,同步方法
優點:解決了執行緒不安全問題
缺點:效率太低了,每個執行緒在想獲得類的例項時候,執行getinstance()方法都要進行同步。而其實這個方法只執行一次例項化**就夠了,後面的想要獲得該類例項,直接return就行了。
**示例
實現步驟
1)構造器私有化(防止 new)
2)類的內部聲名靜態物件
3)
class singleton
//提供乙個靜態的公有方法,加入同步處理的**,解決執行緒安全問題
//即懶漢式
public static synchronized singleton getinstance()
return instance;
}}
3)執行緒安全,同步**塊
這種方法,本意是對上一種實現方法的改進,因為前面方法效率太低,改為同步產生例項化的**塊。但這種同步方法並不能起到執行緒同步的作用。跟第一種實現方法情形一致,假如乙個執行緒進入了if(singletion == null)判斷語句塊,還未來得及往下執行,另乙個執行緒也通過了這個判斷語句,這時便會產生多個例項。
結論:在實際開發中,不能使用這種方式
**示例
實現步驟
1)構造器私有化(防止 new)
2)類的內部聲名靜態物件
3)提供乙個靜態的公有方法,在**塊中加入同步處理的**(synchronized)
class singleton
//提供乙個靜態的公有方法,在**塊中加入同步處理的**(synchronized)
//即懶漢式
public static singleton getinstance()
}return singleton;
}}
4)雙重檢查
優點:執行緒安全,延遲載入,效率較高
缺點:無!!!
**示例
實現步驟
1)構造器私有化(防止 new)
2)類的內部聲名靜態物件並用volatile(用來確保將變數的更新操作通知到其他執行緒)關鍵字修飾
3)提供乙個靜態的公有方法,加入雙重檢查**,解決執行緒安全問題,同時解決懶載入問題
class singleton
//提供乙個靜態的公有方法,加入雙重檢查**,解決執行緒安全問題,同時解決懶載入問題
public static synchronized singleton getinstance()
//else 到下面返回 instance}}
//而當再後面的執行緒來時在最上方的判斷語句中就直接來到這裡返回instance
return instance;
}}
5)靜態內部類
優點:
缺點:無 !!!
**示例
實現步驟
1)構造器私有化(防止 new)
2)類的內部聲名靜態物件
3)寫乙個靜態內部類,該類中有乙個靜態屬性外部類的靜態常量
4)提供乙個靜態的公有方法,直接返回靜態內部類常量屬性
class singleton
//寫乙個靜態內部類,該類中有乙個靜態屬性 singleton
private static class singletoninstance
//提供乙個靜態的公有方法,直接返回 singletoninstance.instance
public static synchronized singleton getinstance()
}
6)列舉
這是借助jdk1.5中新增的列舉來實現單例模式。
優點:保證了執行緒安全、防止了反序列化重新建立新的物件
缺點:無 !!!
結論:推薦使用
**示例
//使用列舉,可以實現單例,推薦
enum singleton
}
單例模式 設計模式學習筆記(一)
單例模式乙個類只有乙個物件 建構函式私有,乙個靜態物件,並且提供乙個靜態的初始化物件的方法 using system using system.collections.generic using system.linq using system.text namespace patterntest ...
設計模式學習筆記 單例模式
定義 確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。單例模式的通用類圖如下 如下 public class singleton public static singleton getinstance public void dosomething 這裡需要注意幾個地方 1 要定義...
設計模式學習筆記(單例模式)
保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式是對全域性變數的一種改進。全域性變數空間利用率比較低,且在專案中是乙個不安全隱患,特別是在多執行緒程式中,會有很多的不可 性 同時,使用全域性變數,也不符合物件導向的封裝原則。1 基礎版本 include using namespace...