golang視角下的設計模式

2021-08-17 15:20:42 字數 2503 閱讀 5103

單利模式

func newsingleton() *singleton 

}return instance

}func newsingleton() *singleton

}return instance

}func newsingleton() *singleton }}

return instance

}func newsingleton() *singleton

mu.lock()

defer mu.unlock()

if initialized == 0

atomic.storeuint32(&initialized, 1)

}return instance

}func newsingleton() *singleton

})return instance

}

工廠模式

工廠根據條件產生不同功能的類。工廠模式使用經常使用在替代new的場景中,讓工廠統一根據不同條件生產不同的類。工廠模式在解耦方面將使用者和產品之間的依賴推給了工廠,讓工廠承擔這種依賴關係。工廠模式又分為簡單工廠,抽象工廠。golang實現乙個簡單工廠模式如下:

package main

import (

"fmt"

)type op inte***ce

type a struct

type b struct

type factory struct

func (a *a) getname() string

func (b *b) getname() string

func (f *factory) create(name string) op

return nil

}func main()

依賴注入

具體含義是:當某個角色(可能是乙個例項,呼叫者)需要另乙個角色(另乙個例項,被呼叫者)的協助時,在傳統的程式設計過程中,通常由呼叫者來建立被呼叫者的例項。但在這種場景下,建立被呼叫者例項的工作通常由容器(ioc)來完成,然後注入呼叫者,因此也稱為依賴注入。golang利用函式f可以當做引數來傳遞,同時配合reflect包拿到引數的型別,然後根據呼叫者傳來的引數和型別匹配上之後,最後通過reflect.call()執行具體的函式。

package main

import (

"fmt"

"reflect"

)var inj *injector

type injector struct

func (inj *injector) setmap(value inte***ce{})

func (inj *injector) get(t reflect.type) reflect.value

func (inj *injector) invoke(i inte***ce{}) inte***ce{}

invalues := make(reflect.value, t.numin())

for k := 0; k < t.numin(); k++

ret := reflect.valueof(i).call(invalues)

return ret

}func host(name string, f func(a int, b string) string)

func dependency(a int, b string) string

func main()

inj.setmap(3030)

inj.setmap("zdd")

d := dependency

host("zddhub", d)

inj.setmap(8080)

inj.setmap("www.zddhub.com")

host("website", d)

}

裝飾器模式

裝飾器模式:允許向乙個現有的物件新增新的功能,同時又不改變其結構。這種型別的設計模式屬於結構型模式,它是作為現有的類的乙個包裝。這種模式建立了乙個裝飾類,用來包裝原有的類,並在保持類方法簽名完整性的前提下,提供了額外的功能。我們使用最為頻繁的場景就是http請求的處理:對http請求做cookie校驗。

Golang 設計模式

策略模式 strategy 簡介 策略模式 將演算法或操作抽象成實現共同介面 可以被替換的類,實現邏輯和具體演算法的解耦。將各種行為抽象成演算法,封裝演算法為物件 演算法實現共同介面,呼叫者呼叫時不考慮演算法具體實現,呼叫介面方法即可 呼叫者可隨時替換此演算法物件 應用場景 多個方法選擇一使用,且它...

Golang設計模式 工廠模式

定義乙個用於建立物件的介面,讓子類界定例項化哪個類。工廠方法使乙個類的例項化延遲到子類。簡單工廠模式的最大優點在於工廠類中包含了必要的邏輯判斷,根據客戶的選擇動態例項化相關的類,對於客戶端來說,去除了與具體產品的依賴。如果是翻譯,讓客戶端不管用哪個類的例項,只需把翻譯型別 int 1,2,3 給工廠...

設計模式golang 工廠模式

建立物件的介面,讓其子類自己決定例項化哪個類,工廠模式使其建立過程延遲到子類進行。1.產品抽象介面 2.工廠建立產品方法 3.產品例項 選銀行借錢的例子,資質方法根據你的收入等其他情況給你選擇銀行。抽象產品介面 type bank inte ce 具體銀行產品例項 type bjbank struc...