這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
前一篇文章,我說到在項目中引入了golang開發一個終端程式,體會到了golang的一些很有吸引力的特質,想要靈活的使用一門語言,當然不能只停留在hello world階段。
溫故而知新,我想通過對設計模式的回顧,來逐步掌握golang的使用,廢話不多說,come on 。
有個有趣的現象,如果你參加過軟體工程師的面試,當被問到設計模式的問題,超過80%的人的答案都會提到Singleton,原因很簡單,單態模式是最簡單也是最易學的設計模式之一,下面我們來看看單態模式在golang中的應用...
單態模式非常好記憶,如同它的名稱描述的一樣,提供一個對象的執行個體,並保證在整個應用中沒有重複.當第一次調用這個類的時候,建立執行個體,在應用的其它部分重用這個執行個體。
下面,我們來回顧一下單態模式的一些應用情境
- 當你想使用只一個資料庫連接來訪問資料
- 當你想使用ssh串連去執行一些任務,並且在操作其它任務時不想重新開啟新的串連。
- 如果你想限制某個參數或者空間的訪問,你可以用單態模式作為參數的一道門
- 如果你想限制某個地方的調用次數,你可以使用單態的執行個體來限制調用次數在一個可接受的範圍
這裡有一個計數器案例,來展示單態模式的使用
需求和接受規則
- 當沒有計數器時,建立一個新的計數器,並且初始化為0
- 如果計數器已經存在,那麼就返回存在的計數器的執行個體
- 如果調用計數器Addone,那麼計數器中的計數加油
Golang的單態模式與Java中的實現由些許不同,先回顧下Java中的實現方式
public class Singleton { private static Singleton instance; public static Singleton getInstance(){ if(instance == null){ instance = new Singleton(); } return instance; }}
然而,在golang 裡面並沒有static這種關鍵字,來標識全域靜態變數,那麼我們應該如何來實現單態模式呢?但是 golang的變數範圍也可以達到相同的作用。
type singleton struct{}var instance * singletonfunc GetInstance() *singleton{ if instance == nil { instance = new(singleton) } return instance}
對於golang的代碼,有必要做一些解釋
在golang裡沒有private 和public 這種保留關鍵字,那麼我們如何來控制存取範圍呢? 大小寫,對,字母大小寫。有意思的是,scala 用大小寫來區分常數和變數,goLang用字母大小寫來區別存取範圍,可見,這些語言創始人對編碼規範有著近似變態的審美。
上面的代碼中 type singleton struct 即對于于java中class singleton 即我們的單態類型,現在有了單態類型,那麼,現在我們還需要一個方法來標識計數器的增加,換句通俗的話講,就是我們需要給sigleton添加一個方法。那麼,怎麼做呢?
func (s *singleton) Addone() int{}
這樣我們就為signleton 添加了一個方法
現在我們看下完整的代碼
package countertype singleton struct{ count int}var instance *singletonfunc GetInstance()* singleton{ if instance == nil{ instance = new(singleton) } return instance}func (s *singleton) Addone() int{ s.count ++ return s.count}
對比下java的完整實現
public class Counter{ private static instance Counter; private static int count; public static Counter getInstance(){ if(instance == null){ instance = new Counter(); } return instance; } public static int addOne(){ count++; return count; }}
好了,到這裡介紹完畢。