golang 之單態模式(singleton)

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

前一篇文章,我說到在項目中引入了golang開發一個終端程式,體會到了golang的一些很有吸引力的特質,想要靈活的使用一門語言,當然不能只停留在hello world階段。

溫故而知新,我想通過對設計模式的回顧,來逐步掌握golang的使用,廢話不多說,come on 。

有個有趣的現象,如果你參加過軟體工程師的面試,當被問到設計模式的問題,超過80%的人的答案都會提到Singleton,原因很簡單,單態模式是最簡單也是最易學的設計模式之一,下面我們來看看單態模式在golang中的應用...

單態模式非常好記憶,如同它的名稱描述的一樣,提供一個對象的執行個體,並保證在整個應用中沒有重複.當第一次調用這個類的時候,建立執行個體,在應用的其它部分重用這個執行個體。

下面,我們來回顧一下單態模式的一些應用情境

  1. 當你想使用只一個資料庫連接來訪問資料
  2. 當你想使用ssh串連去執行一些任務,並且在操作其它任務時不想重新開啟新的串連。
  3. 如果你想限制某個參數或者空間的訪問,你可以用單態模式作為參數的一道門
  4. 如果你想限制某個地方的調用次數,你可以使用單態的執行個體來限制調用次數在一個可接受的範圍

這裡有一個計數器案例,來展示單態模式的使用

需求和接受規則

  1. 當沒有計數器時,建立一個新的計數器,並且初始化為0
  2. 如果計數器已經存在,那麼就返回存在的計數器的執行個體
  3. 如果調用計數器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;    }}

好了,到這裡介紹完畢。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.