Java Singleton 單例模式思考
在設計模式中,單例模式(Singleton)是最長見得一種設計模式之一。什麼是單例模式呢?就是在整個系統中,只有一個唯一存在的例項。這樣的情況可以幹什麼用呢?比如可以統計網站的訪問量,一些連線池(資料庫連線池等)。
一個最簡單的單例模式 – 餓漢模式
那麼怎麼能保證只有一個物件的存在呢?首先得有一個static的例項,這個方法保證了一個class只有一個例項。還得防止外界使用構造器來new一個例項。
1 2 3 4 5 |
//一個沒有封裝的單例模式
public
class
Singleton { public
static
final
Singleton singleton = new
Singleton();
private
Singleton(){}
}
|
外界就可以使用Singleton.singleton
這樣的方法來呼叫了。但是這樣存在的問題就是分裝不夠好,新增一個方法,返回singleton的引用。如下
1 2 3 4 5 6 |
//最簡單的封裝單例改進版。餓漢模式
public
class
Singleton { public
static
final
Singleton singleton = new
Singleton();
private
Singleton(){}
public
static
Singleton getInstance(){ return
singleton; }
}
|
當代碼寫到這,我們終於可以鬆一口氣了,原來單例模式也很簡單呀,就這麼幾行的程式碼。對,其實這個是最簡單的一種方式,能夠應付大部分的場景的。
不過,其他class在引用Singleton而不使用的時候,虛擬機器會自動載入這個類,並且例項化這個物件(這點知道Java虛擬機器的類載入就會了解那麼一些)。於是我們就有了下面的寫法。
延遲例項化(懶漢模式) – 在呼叫時進行例項化
經常能看見其他的單例模式會教下面的程式碼,這樣的人估計是從《設計模式 – 可複用面向物件軟體的基礎》那本書看來的。這本書使用的是C++語言寫的,然後就將其轉到了Java平臺來。
首先他們會說我們的程式碼應該先這樣,在呼叫的時候,發現為null,再進行例項化該類。
01 02 03 04 05 06 07 08 09 10 |
public
class
Singleton {
public
static
final
Singleton singleton = null ;
private
Singleton(){}
public
static
Singleton getInstance(){
|