5.1. 模式動(dòng)機(jī)
對(duì)于系統(tǒng)中的某些類來說稚补,只有一個(gè)實(shí)例很重要,例如慎菲,一個(gè)系統(tǒng)中可以存在多個(gè)打印任務(wù)嫁蛇,但是只能有一個(gè)正在工作的任務(wù);一個(gè)系統(tǒng)只能有一個(gè)窗口管理器或文件系統(tǒng)露该;一個(gè)系統(tǒng)只能有一個(gè)計(jì)時(shí)工具或ID(序號(hào))生成器睬棚。
如何保證一個(gè)類只有一個(gè)實(shí)例并且這個(gè)實(shí)例易于被訪問呢?定義一個(gè)全局變量可以確保對(duì)象隨時(shí)都可以被訪問,但不能防止我們實(shí)例化多個(gè)對(duì)象抑党。
一個(gè)更好的解決辦法是讓類自身負(fù)責(zé)保存它的唯一實(shí)例包警。這個(gè)類可以保證沒有其他實(shí)例被創(chuàng)建,并且它可以提供一個(gè)訪問該實(shí)例的方法底靠。這就是單例模式的模式動(dòng)機(jī)害晦。
5.2. 模式定義
單例模式(Singleton Pattern):單例模式確保某一個(gè)類只有一個(gè)實(shí)例,而且自行實(shí)例化并向整個(gè)系統(tǒng)提供這個(gè)實(shí)例苛骨,這個(gè)類稱為單例類篱瞎,它提供全局訪問的方法。
單例模式的要點(diǎn)有三個(gè):一是某個(gè)類只能有一個(gè)實(shí)例痒芝;二是它必須自行創(chuàng)建這個(gè)實(shí)例;三是它必須自行向整個(gè)系統(tǒng)提供這個(gè)實(shí)例牵素。單例模式是一種對(duì)象創(chuàng)建型模式严衬。單例模式又名單件模式或單態(tài)模式。
5.3. 模式結(jié)構(gòu)
單例模式包含如下角色:
- Singleton:單例
5.4. 代碼分析
package singleton
import "sync"
//Singleton 是單例模式類
type Singleton struct{}
var singleton *Singleton
var once sync.Once
//GetInstance 用于獲取單例模式對(duì)象
func GetInstance() *Singleton {
once.Do(func() {
singleton = &Singleton{}
})
return singleton
}
package singleton
import "testing"
func TestSingleton(t *testing.T) {
ins1 := GetInstance()
ins2 := GetInstance()
if ins1 != ins2 {
t.Fatal("instance is not equal")
}
}