有一些物件我們只需要使用乙個,例如執行緒池,快取,對話方塊,日誌物件等等。如果這些物件有多個例項,就會導致許多問題產生,像程式的行為異常,記憶體溢位,或者是不一致的結果。
使用全域性變數可以達到效果,但同時,全域性變數在程式一開始就被建立,如果這是乙個佔資源大的物件,而在這次執行中程式沒有使用到該變數,這就形成了資源浪費。
定義:單例模式確保類只有乙個例項,並提供乙個全域性訪問點。
經典的單例模式實現
public
class
singleton
public
static singleton getinstance()
return uniqueinstance;
}//其他方法
}
上面就是乙個經典的單例模式,私有構造器,共有建立方法,當類變數為空時,我們建立乙個例項並返回它,我們稱這種方式為延遲例項化,也就是」餓漢模式「。下面再看乙個例子
原始**
public
class
chocolateboiler
public
void
fill()
}public
void
drain()
}public
void
boil()
}public
boolean
isempty()
public
boolean
isboiled()
}
為了使得不出現不一致的情況,我們決定使用單例模式,如下
懶漢模式
public
class
chocolateboiler
public
static chocolateboiler getinstance()
return instance;
}//其他方法
}
出現問題了:我們的fill()方法竟然允許在boil()時候繼續新增原料,這不符合我們的邏輯。
經過檢查,我們發現這是由於有兩個執行緒同時去獲取這個例項造成的錯誤,解決方法如下
加鎖
public
class
chocolateboiler
public
static
synchronized chocolateboiler getinstance()
return instance;
}//其他方法
}
在方法上加鎖能確保同時只有乙個執行緒能夠拿到該例項。但是,使用synchronized會降低效能,而我們只有第一次執行該方法時才需要同步,之後每次呼叫該方法都會造成對效能的浪費。
「餓漢模式」
public
class
chocolateboiler
public
static
synchronized chocolateboiler getinstance()
}
雙重加鎖檢查
public
class
chocolateboiler
public
static chocolateboiler getinstance()
}}return instance;
}}
上例使用了雙重檢查,首先檢查是否建立了例項,只有未建立的時候才會進入同步塊。這樣就大大降低了效能消耗 設計模式(五) 單例模式
單例模式,主要由以下幾個模組組成 私有的靜態物件例項,私有的構造方法 避免外部呼叫new物件,保證只有乙個物件的例項 乙個共有的靜態獲取物件的方法 供外部呼叫 如下 懶漢式單例模式 在需要的時候,也即呼叫共有的靜態獲取物件的方法時才建立物件 package singlepattern public ...
設計模式學習筆記 單例模式
定義 確保某乙個類只有乙個例項,而且自行例項化並向整個系統提供這個例項。單例模式的通用類圖如下 如下 public class singleton public static singleton getinstance public void dosomething 這裡需要注意幾個地方 1 要定義...
設計模式學習筆記(單例模式)
保證乙個類僅有乙個例項,並提供乙個訪問它的全域性訪問點。單例模式是對全域性變數的一種改進。全域性變數空間利用率比較低,且在專案中是乙個不安全隱患,特別是在多執行緒程式中,會有很多的不可 性 同時,使用全域性變數,也不符合物件導向的封裝原則。1 基礎版本 include using namespace...