<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
單例模式很容易記住。就像名稱一樣,它只能提供物件的單一範例,保證一個類只有一個範例,並提供一個全域性存取該範例的方法。
在第一次呼叫該範例時被建立,然後在應用程式中需要使用該特定行為的所有部分之間重複使用。
你會在許多不同的情況下使用單例模式。比如:
單例模式還有跟多的用途,這裡只是簡單的舉出一些。
我們可以寫一個計數器,它的功能是用於儲存它在程式執行期間被呼叫的次數。這個計數器的需要滿足的幾個要求:
count
時,將建立一個新的計數器 count = 0
count
數AddOne
一次,計數 count
必須增加 1在這個場景下,我們需要有 3 個測試來堅持我們的單元測試。
與 Java 或 C++ 這種物件導向語言中不同,Go 實現單例模式沒有像靜態成員的東西(通過 static 修飾),但是可以通過包的範圍來提供一個類似的功能。
首先,我們要為單例物件編寫包的宣告:
package singleton type Singleton struct { count int } var instance *Singleton func init() { instance = &Singleton{} } func GetInstance() *Singleton { return nil } func (s *Singleton) AddOne() int { return 0 }
然後,我們通過編寫測試程式碼來驗證我們宣告的函數:
package singleton import ( "testing" ) func TestGetInstance(t *testing.T) { count := GetInstance() if count == nil { t.Error("A new connection object must have been made") } expectedCounter := count currentCount := count.AddOne() if currentCount != 1 { t.Errorf("After calling for the first time to count, the count must be 1 but it is %dn", currentCount) } count2 := GetInstance() if count2 != expectedCounter { t.Error("Singleton instances must be different") } currentCount = count2.AddOne() if currentCount != 2 { t.Errorf("After calling 'AddOne' using the second counter, the current count must be 2 but was %dn", currentCount) } }
第一個測試是檢查是顯而易見,但在複雜的應用中,其重要性也不小。當我們要求獲得一個計數器的範例時,我們實際上需要得到一個結果。
我們把物件的建立委託給一個未知的包,而這個物件在建立或檢索物件時可能失敗。我們還將當前的計數器儲存在變數 expectedCounter
中,以便以後進行比較。即:
currentCount := count.AddOne() if currentCount != 1 { t.Errorf("After calling for the first time to count, the count must be 1 but it is %dn", currentCount) }
執行上面的程式碼:
$ go test -v -run=GetInstance . === RUN TestGetInstance singleton_test.go:12: A new connection object must have been made singleton_test.go:19: After calling for the first time to count, the count must be 1 but it is 0 singleton_test.go:31: After calling 'AddOne' using the second counter, the current count must be 2 but was 0 --- FAIL: TestGetInstance (0.00s) FAIL FAIL github.com/yuzhoustayhungry/GoDesignPattern/singleton 0.412s FAIL
最後,我們必須實現單例模式。正如我們前面提到的,通常做法是寫一個靜態方法和範例來檢索單例模式範例。
在 Go 中,沒有 static
這個關鍵字,但是我們可以通過使用包的範圍來達到同樣的效果。
首先,我們建立一個結構體,其中包含我們想要保證的物件 在程式執行過程中成為單例的物件。
package singleton type Singleton struct { count int } var instance *Singleton func init() { instance = &Singleton{} } func GetInstance() *Singleton { if instance == nil { instance = new(Singleton) } return instance } func (s *Singleton) AddOne() int { s.count++ return s.count }
我們來分析一下這段程式碼的差別,在 Java 或 C++ 語言中,變數範例會在程式開始時被初始化為 NULL
。 但在 Go 中,你可以將結構的指標初始化為 nil
,但不能將一個結構初始化為 nil
(相當於其他語言的 NULL
)。
所以 var instance *singleton*
這一語句定義了一個指向結構的指標為 nil
,而變數稱為 instance
。
我們建立了一個 GetInstance
方法,檢查範例是否已經被初始化(instance == nil
),並在已經分配的空間中建立一個範例 instance = new(singleton)
。
Addone()
方法將獲取變數範例的計數,並逐個加 1,然後返回當前計數器的值。
再一次執行單元測試程式碼:
$ go test -v -run=GetInstance . === RUN TestGetInstance --- PASS: TestGetInstance (0.00s) PASS ok github.com/yuzhoustayhungry/GoDesignPattern/singleton 0.297s
優點:
缺點:
以上就是詳解Go語言設計模式之單例模式的詳細內容,更多關於Go語言 單例模式的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45