設(shè)計(jì)模式總共24種, 本篇教你學(xué)會在go語言中使用創(chuàng)建型模式
成都創(chuàng)新互聯(lián)公司主營順昌網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,重慶App定制開發(fā),順昌h5小程序設(shè)計(jì)搭建,順昌網(wǎng)站營銷推廣歡迎順昌等地區(qū)企業(yè)咨詢創(chuàng)建型: 單例模式 簡單工廠模式 工廠方法模式 抽象工廠模式 建造者模式 原型模式
結(jié)構(gòu)型: 代理模式 適配器模式 裝飾器模式 橋接模式 組合模式 享元模式 外觀模式
行為型: 觀察者模式 模板方法模式 命令模式 狀態(tài)模式 職責(zé)鏈模式 解釋器模式 中介者模式 訪問者模式 策略模式 備忘錄模式 迭代器模式
// Singleton 單例結(jié)構(gòu)
type Singleton struct{}
var (
// 定義單例對象和sync.Once變量組聲明
singleton *Singleton
once sync.Once
)
// 實(shí)現(xiàn)初始化單例對象私有函數(shù)
func initSingleton() {
singleton = &Singleton{}
}
// GetInstance 用于獲取單例對象
func GetInstance() *Singleton {
once.Do(initSingleton)
return singleton
}
初始化包全局變量使用,如log初始化等,對于能在 main 中直接完成的初始化操作可以不使用單例模式。
單例模式的主要優(yōu)點(diǎn)在于提供了對唯一實(shí)例的受控訪問并可以節(jié)約系統(tǒng)資源
https://medium.com/golang-issue/how-singleton-pattern-works-with-golang-2fdd61cd5a7f
// 定義 API 接口
type API interface {
Save()
}
// 定義 New 函數(shù)返回 API
func NewAPI(name string) API {
if name == "mem" {
return &memAPI{}
} else if name == "file" {
return &fileAPI{}
}
return nil
}
// 實(shí)現(xiàn)接口類型
type memAPI struct{}
func (*memAPI) Save() {
}
// 實(shí)現(xiàn)接口類型
type fileAPI struct{}
func (*fileAPI) Save() {
}
常用于組件開發(fā)中,如消息中間件、緩存中間件
封裝了實(shí)現(xiàn)細(xì)節(jié),將對象的創(chuàng)建和使用分離,方便內(nèi)部實(shí)現(xiàn)擴(kuò)展
// Builder 建造者接口
type Builder interface {
Part1()
Part2()
Part3()
}
// Director 指揮官
type Director struct {
builder Builder
}
func NewDirector(builder Builder) *Director {
return &Director{
builder: builder,
}
}
func (d *Director) Construct() {
d.builder.Part1()
d.builder.Part2()
d.builder.Part3()
}
type Builder1 struct {
result string
}
func (b *Builder1) Part1() {
b.result += "1"
}
func (b *Builder1) Part2() {
b.result += "2"
}
func (b *Builder1) Part3() {
b.result += "3"
}
func (b *Builder1) GetResult() string {
return b.result
}
type Builder2 struct {
result int
}
func (b *Builder2) Part1() {
b.result += 1
}
func (b *Builder2) Part2() {
b.result += 2
}
func (b *Builder2) Part3() {
b.result += 3
}
func (b *Builder2) GetResult() int {
return b.result
}
在很多游戲軟件中,地圖包括天空、地面、背景等組成部分,人物角色包括人體、服裝、裝備等組成部分,可以使用建造者模式對其進(jìn)行設(shè)計(jì),通過不同的具體建造者創(chuàng)建不同類型的地圖或人物。
將產(chǎn)品本身與產(chǎn)品的創(chuàng)建過程解耦,使得相同的創(chuàng)建過程可以創(chuàng)建不同的產(chǎn)品對象。
// 示例結(jié)構(gòu)體
type Example struct {
Content string
}
func (e *Example) Clone() *Example {
res := *e
return &res
}
func main() {
r1 := new(Example)
r1.Content = "this is example 1"
r2 := r1.Clone()
r2.Content = "this is example 2"
fmt.Println(r1)
fmt.Println(r2)
}
相似但重新創(chuàng)建會比較繁瑣的對象
參考鏈接:
https://www.cnblogs.com/zuoxiaolong/p/pattern26.html
https://design-patterns.readthedocs.io/zh_CN/latest/index.html
創(chuàng)新互聯(lián)www.cdcxhl.cn,專業(yè)提供香港、美國云服務(wù)器,動態(tài)BGP最優(yōu)骨干路由自動選擇,持續(xù)穩(wěn)定高效的網(wǎng)絡(luò)助力業(yè)務(wù)部署。公司持有工信部辦法的idc、isp許可證, 機(jī)房獨(dú)有T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確進(jìn)行流量調(diào)度,確保服務(wù)器高可用性。佳節(jié)活動現(xiàn)已開啟,新人活動云服務(wù)器買多久送多久。