欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Go構(gòu)建器模式構(gòu)建復(fù)雜對象方法實例

 更新時間:2023年12月15日 11:12:48   作者:俞凡  
本文介紹了構(gòu)建器模式,如何通過構(gòu)建器對象構(gòu)建復(fù)雜業(yè)務(wù)對象的方法實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

構(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): ElectricCarBuilderGasolineCarBuilder。

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
}

ElectricCarBuilderGaslineCarBuilder都嵌入了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)建了ElectricCarBuilderGasolineCarBuilder,并分別創(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多線程下載器實現(xiàn)高效快速地下載大文件

    Golang多線程下載器是一種高效、快速地下載大文件的方法。Golang語言天生支持并發(fā)和多線程,可以輕松實現(xiàn)多線程下載器的開發(fā)。通過使用Golang的協(xié)程和通道,可以將下載任務(wù)分配到多個線程中并行處理,提高了下載的效率和速度
    2023-05-05
  • Go 自動升級依賴版本的幾種方法實現(xiàn)

    Go 自動升級依賴版本的幾種方法實現(xiàn)

    Go語言使用GoModules進行依賴管理,可以通過多種方式自動升級依賴,本文就來介紹Go 自動升級依賴版本的7種方法,感興趣的可以了解一下
    2025-03-03
  • 源碼分析Golang?log是如何實現(xiàn)的

    源碼分析Golang?log是如何實現(xiàn)的

    go語言的log包提供了簡單的日志記錄功能,允許開發(fā)者在應(yīng)用程序中記錄重要的信息、錯誤、警告等,log包是Go標準庫的一部分,因此,使用它不需要安裝額外的第三方庫,本文給大家源碼分析了Golang?log是如何實現(xiàn)的,需要的朋友可以參考下
    2024-03-03
  • Go語言實現(xiàn)二維數(shù)組的2種遍歷方式以及案例詳解

    Go語言實現(xiàn)二維數(shù)組的2種遍歷方式以及案例詳解

    這篇文章主要介紹了Go語言實現(xiàn)二維數(shù)組的2種遍歷方式以及案例詳解,圖文代碼聲情并茂,有感興趣的可以學(xué)習(xí)下
    2021-03-03
  • GO語言入門Golang進入HelloWorld

    GO語言入門Golang進入HelloWorld

    本篇文章是go語言基礎(chǔ)篇,非常適合go語言剛?cè)腴T的小白,主要介紹了GO語言入門Golang進入HelloWorld,跟著小編一起來編寫Go語言的第一程序helloworld吧
    2021-09-09
  • 一文帶你探索Golang計時器的奧秘

    一文帶你探索Golang計時器的奧秘

    在?Golang?中,計時器(timer)是一種常見的工具,用于定期執(zhí)行某個任務(wù)或者在指定時間后觸發(fā)某個事件。本文將深入探討?Golang?計時器的實現(xiàn)原理和使用方法,幫助大家更好地理解和應(yīng)用計時器
    2023-05-05
  • 創(chuàng)建Go工程化項目布局詳解

    創(chuàng)建Go工程化項目布局詳解

    這篇文章主要介紹了創(chuàng)建Go工程化項目布局詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Golang實現(xiàn)圖片上傳功能的示例代碼

    Golang實現(xiàn)圖片上傳功能的示例代碼

    這篇文章主要和大家分享一下如何利用Golang實現(xiàn)圖片上傳功能,文中的實現(xiàn)步驟講解詳細,對我們學(xué)習(xí)有一定的參考價值,需要的可以參考一下
    2022-05-05
  • golang實現(xiàn)通過smtp發(fā)送電子郵件的方法

    golang實現(xiàn)通過smtp發(fā)送電子郵件的方法

    這篇文章主要介紹了golang實現(xiàn)通過smtp發(fā)送電子郵件的方法,實例分析了Go語言基于SMTP協(xié)議發(fā)送郵件的相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • win10下安裝Go和Goland的詳細教程

    win10下安裝Go和Goland的詳細教程

    這篇文章主要介紹了win10下安裝Go和Goland的詳細教程,本文給大家提到了go和golang之間的區(qū)別,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12

最新評論