最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go|使用Options模式和建造者模式創(chuàng)建對象實(shí)戰(zhàn)

 更新時(shí)間:2023年04月17日 10:49:40   作者:小雄Ya  
這篇文章主要介紹了Go使用Options模式和建造者模式創(chuàng)建對象實(shí)戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

復(fù)雜對象的問題

在 Golang 中一般創(chuàng)建復(fù)雜對象,一般會使用2種方式創(chuàng)建對象:Options 模式(函數(shù)式選項(xiàng)模式)和建造者模式。這兩種模式都有其它們各自優(yōu)點(diǎn)和缺點(diǎn),如何使用主要還是要依賴于你的使用場景吧。

創(chuàng)建一個(gè)簡單的對象 User。

type User struct {
	Name string
	Age  int
}
func NewObj(a string, b int) *User {
	user := User{}
	user.Name = a
	user.Age = b
	return &user
}

以上源碼使用構(gòu)造函數(shù)的方式創(chuàng)建一個(gè) User 對象,但是當(dāng)我們對象具有許多可選參數(shù)的復(fù)雜對象時(shí),那在構(gòu)造函數(shù)接受所有參數(shù)并為可選參數(shù)提供默認(rèn)值時(shí)就會出現(xiàn)一些問題。比如太多參數(shù)需要記住各參數(shù)的順序,還需知道哪些是可選的哪些是必須的。這樣就導(dǎo)致你的構(gòu)造函數(shù)變得很長且難理解。

Options 模式

使用 Options 模式就可以用來創(chuàng)建許多可選參數(shù)的對象。通過先定義一個(gè)可選參數(shù)的結(jié)構(gòu),并提供設(shè)置這些參數(shù)的方法。詳細(xì)實(shí)現(xiàn)可以看以下例子:

type User struct {
	Name string
	Age  int
}
type UserOptions struct {
	Name string
	Age  int
}
type UserOpt func(options *UserOptions)
func WithName(name string) UserOpt {
	return func(op *UserOptions) {
		op.Name = name
	}
}
func WithAge(age int) UserOpt {
	return func(op *UserOptions) {
		op.Age = age
	}
}
func NewUser(options ...UserOpt) *User {
	opts := &UserOptions{}
	for _, option := range options {
		option(opts)
	}
	user := &User{
		Name: opts.Name,
		Age:  opts.Age,
	}
	return user
}

源碼分析:定義了2個(gè)結(jié)構(gòu)體 User 和 UserOptions ,還有一個(gè)帶可選參數(shù)的結(jié)構(gòu) UserOpt。還需要定義函數(shù)來給每個(gè)字段賦值,且返回結(jié)果是一個(gè) UserOpt,它在 UserOptions 結(jié)構(gòu)上設(shè)置相應(yīng)的字段。

最后可以看到構(gòu)造函數(shù) NewUser 函數(shù)接受任意數(shù)量的 UserOpt 并構(gòu)造出一個(gè) User 對象。

func main(){
	user := NewUser(WithName("xiaoxiongYa"),withAge(18))
  println(user.name, user.age)
}

Options 模式其中需要定義函數(shù)然后給每個(gè)字段賦值,這樣就會造成一個(gè)問題:當(dāng)對象有很多字段時(shí)就需要設(shè)置所有字段所對應(yīng)的賦值函數(shù),這樣就會變的整個(gè)函數(shù)量變大。

所以,對于字段很多時(shí)就可以考慮使用 Builder 模式。

建造者模式

建造者模式是將一個(gè)復(fù)雜對象的構(gòu)造與它的表示分離,使得同樣的構(gòu)建過程可以創(chuàng)建不同的對象。即一個(gè)復(fù)雜對象分解成多個(gè)簡單對象。

type User struct {
	name string
	age  int
}
type UserBuilder interface {
	SetName(string) UserBuilder
	SetAge(int) UserBuilder
	Build() *User
}
type ConcreteUserBuilder struct {
	user *User
}
func NewConcreteUserBuilder() *ConcreteUserBuilder {
	return &ConcreteUserBuilder{user: &User{}}
}
func (ub *ConcreteUserBuilder) SetName(name string) UserBuilder {
	ub.user.name = name
	return ub
}
func (ub *ConcreteUserBuilder) SetAge(age int) UserBuilder {
	ub.user.age = age
	return ub
}
func (ub *ConcreteUserBuilder) Build(age int) *User {
	return ub.user
}
type Director struct {
	builder UserBuilder
}
func NewDirector(builder UserBuilder) *Director {
	return &Director{builder: builder}
}
func (d *Director) Construct() *User {
	return d.builder.SetName("xiaoxiong").SetAge(18).Build()
}

在上面代碼中,首先定義了 User 結(jié)構(gòu)和 UserBuilder 接口,ConcreteUserBuilder 結(jié)構(gòu)實(shí)現(xiàn)了 UserBuilder 接口并提供了一種構(gòu)造 User 對象的方法。當(dāng)然還需要一個(gè) Director 結(jié)構(gòu),它主要是使用 UserBuilder 去構(gòu)造 User 對象。簡化了構(gòu)建 User 對象過程的方法。

builder := NewConcreteUserBuilder()
director := NewDirector()
user := director.Construct()

這樣就創(chuàng)建了一個(gè) name = xiaoxiong ,age=18 的 User 對象。

總結(jié)

  • Options 模式在封裝庫很常被使用,將一些功能封裝成對象,使其支持多個(gè)可選參數(shù)。Options 模式比 Builder 模式簡潔且對于參數(shù)比較少的對象使用更方便。但是對于有許多參數(shù)的對象就會很啰嗦
  • 建造者模式允許創(chuàng)建具有許多可選參數(shù)的復(fù)雜對象。它將對象的構(gòu)造與其表示分開,并提供了一種使用相同構(gòu)造過程創(chuàng)建同一對象的不同表示的方法。相比較建造者模式會更加強(qiáng)大。

以上就是Go|使用Options模式和建造者模式創(chuàng)建對象實(shí)戰(zhàn)的詳細(xì)內(nèi)容,更多關(guān)于Go Options創(chuàng)建對象的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Golang高性能持久化解決方案BoltDB數(shù)據(jù)庫介紹

    Golang高性能持久化解決方案BoltDB數(shù)據(jù)庫介紹

    這篇文章主要為大家介紹了Golang高性能持久化解決方案BoltDB數(shù)據(jù)庫介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2021-11-11
  • Go語言中l(wèi)og日志庫的介紹

    Go語言中l(wèi)og日志庫的介紹

    本文給大家介紹Go語言中l(wèi)og日志庫的概念使用技巧,log包定義了Logger類型,該類型提供了一些格式化輸出的方法,本文通過示例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-10-10
  • golang與pgsql交互的實(shí)現(xiàn)

    golang與pgsql交互的實(shí)現(xiàn)

    本文主要介紹了golang與pgsql交互的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • golang框架gin的日志處理和zap lumberjack日志使用方式

    golang框架gin的日志處理和zap lumberjack日志使用方式

    這篇文章主要介紹了golang框架gin的日志處理和zap lumberjack日志使用方式,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • 深入了解Go語言編譯鏈接的過程

    深入了解Go語言編譯鏈接的過程

    Go在編譯時(shí)會將interface和channel關(guān)鍵字轉(zhuǎn)換成runtime中的結(jié)構(gòu)和函數(shù)調(diào)用,所以小編覺得很有必要就Go的編譯過程理一理做個(gè)進(jìn)行總結(jié),下面就來和小編一起了解一下Go語言編譯鏈接的過程吧
    2023-08-08
  • golang生成JSON以及解析JSON

    golang生成JSON以及解析JSON

    這篇文章主要介紹了golang生成JSON以及解析JSON,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • Golang接入釘釘通知的示例代碼

    Golang接入釘釘通知的示例代碼

    本文主要介紹了Golang接入釘釘通知的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • golang防止內(nèi)存逃逸的方法小結(jié)

    golang防止內(nèi)存逃逸的方法小結(jié)

    在Go語言中,內(nèi)存逃逸是指在函數(shù)中分配的變量在函數(shù)結(jié)束后仍然被引用,防止內(nèi)存逃逸有助于提高程序的性能,因?yàn)闂I戏峙涞膬?nèi)存可以更快地被回收,本文給大家總結(jié)了一些防止內(nèi)存逃逸的方法,需要的朋友可以參考下
    2024-02-02
  • 詳解Go channel管道的運(yùn)行原理

    詳解Go channel管道的運(yùn)行原理

    Go推薦通過通信來共享內(nèi)存,而channel就實(shí)現(xiàn)了這一理念。那channel是怎么運(yùn)行的呢?本文將帶你搞懂Go channel管道的運(yùn)行原理,感興趣的同學(xué)可以參考一下
    2023-05-05
  • Go中的fuzz模糊測試使用實(shí)戰(zhàn)詳解

    Go中的fuzz模糊測試使用實(shí)戰(zhàn)詳解

    這篇文章主要為大家介紹了Go中的fuzz模糊測試使用實(shí)戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12

最新評論

芜湖市| 凤冈县| 沽源县| 隆安县| 措美县| 耿马| 星子县| 嘉禾县| 灵台县| 同德县| 和政县| 梁河县| 大荔县| 同心县| 黔江区| 湛江市| 五河县| 曲周县| 论坛| 景洪市| 丰台区| 南木林县| 岢岚县| 称多县| 平邑县| 霍林郭勒市| 南陵县| 抚宁县| 资阳市| 永丰县| 温泉县| 商水县| 乌恰县| 齐河县| 石屏县| 洪泽县| 宾川县| 伊春市| 仙桃市| 新河县| 尉氏县|