成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

在Go中構建復雜對象: 構建器模式指南

開發 后端
本文我們介紹了構建器模式,介紹了如何通過構建器對象構建復雜業務對象的方法。

構建具有許多可選參數的復雜對象可能是一項艱巨的任務。

當處理具有許多可選參數的對象時,傳統構造函數和setter方法會變得很麻煩。

本文將探討構建器模式(builder pattern),這是一種允許創建具有許多可選參數的復雜對象的設計模式。

我們將介紹基于Go的構建器模式示例實現,并討論如何創建同一對象的不同變體。

+----------------+               +-------------------+
|     Director   |  directs      |      Builder      |
+----------------+               +-------------------+
| construct()    | ------------> | buildPart1()      |
| setBuilder()   |               | buildPart2()      |
+----------------+               | getProduct()      |
                                 +-------------------+
                                           |
                                           V
                                 +-------------------+
                                 |      Product      |
                                 +-------------------+
                                 | field1            |
                                 | field2            |
                                 | ...               |
                                 +-------------------+

在Go中實現構建器模式

下面是golang中構建器模式示例:

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結構嵌入了一個Car對象,所以它的所有字段都可以被構建器訪問。

CarBuilder結構具有設置Car對象可選參數的方法,每個方法返回指向CarBuilder結構體的指針,以允許鏈式調用。

CarBuilder結構體上的Build方法返回指向被構建的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

在這個例子中,我們創建了一個CarBuilder對象,用它的方法來設置Car對象的可選參數。

最后調用Build方法來獲取最終的Car對象。然后打印出Car對象的字段,以驗證是否設置正確。

Go中構建器模式的高級用例

構建器模式有一些高級用例,可以在某些情況下使用。

下面介紹Go中構建器模式的一些高級用例。

創建構建器接口

在構建器模式基本示例中,有一個用于構建對象的builder結構。

不過我們可以創建builder接口,讓不同builder結構實現其接口。

當我們需要使用相同模式構建不同類型的對象時,這非常有用。

假設有兩種類型的汽車: 電動汽車和汽油汽車,有相同的可選參數,但有不同的必需參數。

在這種情況下,可以創建一個CarBuilder接口,指定構建汽車所需的方法,然后創建兩個實現CarBuilder接口的結構: 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結構體并實現了CarBuilder接口。

然后可以自己實現制造汽車所需的方法。

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
}

我們因此可以基于接口創建汽車,也可以使用相同的接口做模擬。

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)
}

在本例中,我們創建了ElectricCarBuilder和GasolineCarBuilder,并分別創建了一輛電動車和一輛汽油車。

CreateCar函數接受CarBuilder接口,并在最后調用Build方法創建Car對象之前,使用構建器的方法設置必需的字段。

參考資料:

[1]Building Complex Objects in Go: A Guide to the Builder Pattern: https://dsysd-dev.medium.com/building-complex-objects-in-go-a-guide-to-the-builder-pattern-1a64bc0eb3ee

責任編輯:趙寧寧 來源: DeepNoMind
相關推薦

2024-06-20 11:49:52

2012-11-20 10:20:57

Go

2022-09-27 14:03:33

新華三

2025-03-26 03:20:00

2024-08-29 08:07:59

GoAPI開發

2024-08-29 10:12:35

RPC通信機制遠程過程

2025-01-09 10:32:05

2021-02-03 15:10:38

GoKubernetesLinux

2022-08-11 11:35:43

Vuev-model?表單

2017-04-17 14:40:11

虛擬化服務器內存

2017-03-28 15:30:51

服務器虛擬化內存

2009-06-18 09:42:52

SpringXFire構建Web

2011-09-13 09:31:07

文件服務器云存儲云計算

2022-10-27 18:03:04

GogRPC云原生

2019-07-05 08:39:39

GoSQL解析器

2011-09-13 10:01:47

文件服務器主板硬盤

2013-03-12 09:50:45

GoRESTful Web

2023-12-14 08:01:08

事件管理器Go

2022-09-20 12:21:25

Vue2Vue3$attrs

2022-09-20 08:43:37

Go編程語言Web
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产在线视频三区 | 四季久久免费一区二区三区四区 | 在线免费观看黄色网址 | 精久久久久 | 成人网在线看 | 亚洲一区av| 九色av | 黄色大片在线免费观看 | wwww.xxxx免费 | 国产精品免费一区二区三区四区 | 一级视频黄色 | 天天看天天摸天天操 | 999久久久国产精品 欧美成人h版在线观看 | 亚洲一区二区三区在线视频 | 欧美国产精品 | 99国产精品99久久久久久粉嫩 | 亚洲免费在线 | 天天爽网站 | 国产精品v | 91久久精品国产免费一区 | 宅男伊人| 国产免费一区二区 | 欧美精品久久久 | 在线中文字幕av | 操久久| 国产一区二区 | 超碰人人人人 | 精品国产成人 | 日韩欧美精品一区 | 欧美日韩在线一区二区 | 国产亚洲一区二区三区在线观看 | 成人亚洲综合 | 日韩欧美精品一区 | 九九热在线视频免费观看 | 久久欧美高清二区三区 | 在线观看国产精品视频 | 欧美一区二区三区在线观看 | 亚洲高清一区二区三区 | 亚洲影音先锋 | 亚洲 精品 综合 精品 自拍 | 欧美日韩在线一区二区 |