go閉包和原廠模式

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

先說原廠模式,原廠模式有3種:簡單原廠模式;Factory 方法模式;抽象原廠模式。

go語言中的閉包已經在上一節golang閉包分析中說過了。

那麼這兩者有什麼必要的聯絡嗎?

假如有這樣一個業務情境,需要我們對不同的字串進行加密。常用的加密方法諸如md5,sha128,sha512等等。

現在我們先看看用簡單原廠模式怎麼實現

(1)定義一個介面 GetResult(s string)string

(2)定義一些加密方法,且這些加密方法均實現了該介面

(3)定義一個工廠類,用於決定使用哪個加密方法

工程結構如下:

——FactoryPattern

       ——methoder

              ——methoder.go

      ——encode

              ——md5.go

              ——sha512.go

      ——factory

             ——factory.go

下面show code:

methoder.go


md5.go


sha512.go


factory.go


main.go


這樣我們就用原廠模式實現了用不同方法加密字串的功能。如果以後還要添加不同的加密方法,那麼直接在encode包裡面添加即可,並且在factory中添加switch分支。


如果我們用閉包能實現這個功能嗎?試試就知道了

為了代碼更清晰,這裡同樣對代碼進行了如上工程結構樣的分包,不同的是原來的factory包現在改為closure包。

接下來主要貼一下closure.go裡面的代碼,其他地方大似相同。


分析一下這個閉包裡面的代碼,Encode()接受的參數是一個methoder.Methoder介面類型的參數,第一個return則是返回一個類型為func(s string)string 的函數,第二個return是調用enc的GetResult方法,並將字串s加密後結果返回給func(s string)string的第二個string(這個string是匿名函數func(s string)string的傳回值類型。

測試函數:



比較一下go閉包實現的原廠模式和普通的原廠模式的區別:

(1)修改代碼的地方:如果添加新的加密方法,且該方法實現了GetResult介面,go閉包的方式不用再factory中添加分支,而普通方式則需要添加switch分支。

(2)耦合性:普通的原廠模式在使用的地方(即測試類別),只需要引入factory的包即可,無需關心encode的包;而go閉包的實現方式則需要在使用的地方引入factory的包和encode的包。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.