Go構(gòu)建器模式構(gòu)建復(fù)雜對象方法實例
正文
構(gòu)建具有許多可選參數(shù)的復(fù)雜對象可能是一項艱巨的任務(wù)。
當處理具有許多可選參數(shù)的對象時,傳統(tǒng)構(gòu)造函數(shù)和 setter 方法會變得很麻煩。
本文將探討構(gòu)建器模式(builder pattern),這是一種允許創(chuàng)建具有許多可選參數(shù)的復(fù)雜對象的設(shè)計模式。
我們將介紹基于 Go 的構(gòu)建器模式示例實現(xiàn),并討論如何創(chuàng)建同一對象的不同變體。
+----------------+ +-------------------+ | Director | directs | Builder | +----------------+ +-------------------+ | construct() | ------------> | buildPart1() | | setBuilder() | | buildPart2() | +----------------+ | getProduct() | +-------------------+ | V +-------------------+ | Product | +-------------------+ | field1 | | field2 | | ... | +-------------------+
在 Go 中實現(xiàn)構(gòu)建器模式
下面是 golang 中構(gòu)建器模式示例
type Car struct { Make string Model string Year int Color string EngineSize float64 } type CarBuilder struct { Car } func (cb *CarBuilder) SetMake(make string) *CarBuilder { cb.Make = make return cb } func (cb *CarBuilder) SetModel(model string) *CarBuilder { cb.Model = model return cb } func (cb *CarBuilder) SetYear(year int) *CarBuilder { cb.Year = year return cb } func (cb *CarBuilder) SetColor(color string) *CarBuilder { cb.Color = color return cb } func (cb *CarBuilder) SetEngineSize(engineSize float64) *CarBuilder { cb.EngineSize = engineSize return cb } func (cb *CarBuilder) Build() *Car { return &cb.Car }
CarBuilder
結(jié)構(gòu)嵌入了一個Car
對象,所以它的所有字段都可以被構(gòu)建器訪問。
CarBuilder
結(jié)構(gòu)具有設(shè)置Car
對象可選參數(shù)的方法,每個方法返回指向CarBuilder
結(jié)構(gòu)體的指針,以允許鏈式調(diào)用。
CarBuilder
結(jié)構(gòu)體上的Build
方法返回指向被構(gòu)建的Car
對象的指針。
使用CarBuilder的例子
carBuilder := &CarBuilder{} car := carBuilder. SetMake("Toyota"). SetModel("Corolla"). SetYear(2021). SetColor("Red"). SetEngineSize(1.8). Build() fmt.Printf("Make: %s\n", car.Make) // Output: Make: Toyota fmt.Printf("Model: %s\n", car.Model) // Output: Model: Corolla fmt.Printf("Year: %d\n", car.Year) // Output: Year: 2021 fmt.Printf("Color: %s\n", car.Color) // Output: Color: Red fmt.Printf("Engine Size: %.1f\n", car.EngineSize) // Output: Engine Size: 1.8
在這個例子中,我們創(chuàng)建了一個CarBuilder
對象,用它的方法來設(shè)置Car
對象的可選參數(shù)。
最后調(diào)用Build
方法來獲取最終的Car
對象。然后打印出Car
對象的字段,以驗證是否設(shè)置正確。
Go 中構(gòu)建器模式的高級用例
構(gòu)建器模式有一些高級用例,可以在某些情況下使用。
下面介紹 Go 中構(gòu)建器模式的一些高級用例。
創(chuàng)建構(gòu)建器接口
在構(gòu)建器模式基本示例中,有一個用于構(gòu)建對象的 builder 結(jié)構(gòu)。
不過我們可以創(chuàng)建 builder 接口,讓不同 builder 結(jié)構(gòu)實現(xiàn)其接口。
當我們需要使用相同模式構(gòu)建不同類型的對象時,這非常有用。
假設(shè)有兩種類型的汽車: 電動汽車和汽油汽車,有相同的可選參數(shù),但有不同的必需參數(shù)。
在這種情況下,可以創(chuàng)建一個CarBuilder
接口,指定構(gòu)建汽車所需的方法,然后創(chuàng)建兩個實現(xiàn)CarBuilder
接口的結(jié)構(gòu): ElectricCarBuilder
和GasolineCarBuilder
。
type CarBuilder interface { SetMake(make string) CarBuilder SetModel(model string) CarBuilder SetYear(year int) CarBuilder SetColor(color string) CarBuilder SetEngineSize(engineSize float64) CarBuilder Build() Car } type ElectricCarBuilder struct { Car } type GasolineCarBuilder struct { Car }
ElectricCarBuilder
和GaslineCarBuilder
都嵌入了Car
結(jié)構(gòu)體并實現(xiàn)了CarBuilder
接口。
然后可以自己實現(xiàn)制造汽車所需的方法。
func (b *ElectricCarBuilder) SetMake(make string) CarBuilder { b.Make = make return b } func (b *ElectricCarBuilder) SetModel(model string) CarBuilder { b.Model = model return b } func (b *ElectricCarBuilder) SetYear(year int) CarBuilder { b.Year = year return b } func (b *ElectricCarBuilder) SetColor(color string) CarBuilder { b.Color = color return b } func (b *ElectricCarBuilder) SetEngineSize(engineSize float64) CarBuilder { b.EngineSize = engineSize return b } func (b *ElectricCarBuilder) Build() Car { return b.Car } func (b *GasolineCarBuilder) SetMake(make string) CarBuilder { b.Make = make return b } func (b *GasolineCarBuilder) SetModel(model string) CarBuilder { b.Model = model return b } func (b *GasolineCarBuilder) SetYear(year int) CarBuilder { b.Year = year return b } func (b *GasolineCarBuilder) SetColor(color string) CarBuilder { b.Color = color return b } func (b *GasolineCarBuilder) SetEngineSize(engineSize float64) CarBuilder { b.EngineSize = engineSize return b } func (b *GasolineCarBuilder) Build() Car { return b.Car }
我們因此可以基于接口創(chuàng)建汽車,也可以使用相同的接口做模擬。
func CreateCar(builder CarBuilder) Car { return builder. SetMake("Toyota"). SetModel("Corolla"). SetYear(2022). SetColor("blue"). SetEngineSize(2.0). Build() } func main() { electricCarBuilder := &ElectricCarBuilder{} gasolineCarBuilder := &GasolineCarBuilder{} electricCar := CreateCar(electricCarBuilder) gasolineCar := CreateCar(gasolineCarBuilder) fmt.Printf("Electric car: %+v\n", electricCar) fmt.Printf("Gasoline car: %+v\n", gasolineCar) }
在本例中,我們創(chuàng)建了ElectricCarBuilder
和GasolineCarBuilder
,并分別創(chuàng)建了一輛電動車和一輛汽油車。
CreateCar
函數(shù)接受CarBuilder
接口,并在最后調(diào)用Build
方法創(chuàng)建Car
對象之前,使用構(gòu)建器的方法設(shè)置必需的字段。
以上就是Go構(gòu)建器模式構(gòu)建復(fù)雜對象方法實例的詳細內(nèi)容,更多關(guān)于Go構(gòu)建復(fù)雜對象的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Golang多線程下載器實現(xiàn)高效快速地下載大文件
Golang多線程下載器是一種高效、快速地下載大文件的方法。Golang語言天生支持并發(fā)和多線程,可以輕松實現(xiàn)多線程下載器的開發(fā)。通過使用Golang的協(xié)程和通道,可以將下載任務(wù)分配到多個線程中并行處理,提高了下載的效率和速度2023-05-05Go語言實現(xiàn)二維數(shù)組的2種遍歷方式以及案例詳解
這篇文章主要介紹了Go語言實現(xiàn)二維數(shù)組的2種遍歷方式以及案例詳解,圖文代碼聲情并茂,有感興趣的可以學(xué)習(xí)下2021-03-03golang實現(xiàn)通過smtp發(fā)送電子郵件的方法
這篇文章主要介紹了golang實現(xiàn)通過smtp發(fā)送電子郵件的方法,實例分析了Go語言基于SMTP協(xié)議發(fā)送郵件的相關(guān)技巧,需要的朋友可以參考下2016-07-07