当前位置:首页 > 科技  > 软件

在Go中构建复杂对象: 构建器模式指南

来源: 责编: 时间:2024-01-15 09:20:31 142观看
导读构建具有许多可选参数的复杂对象可能是一项艰巨的任务。当处理具有许多可选参数的对象时,传统构造函数和setter方法会变得很麻烦。本文将探讨构建器模式(builder pattern),这是一种允许创建具有许多可选参数的复杂对象

构建具有许多可选参数的复杂对象可能是一项艰巨的任务。lBL28资讯网——每日最新资讯28at.com

当处理具有许多可选参数的对象时,传统构造函数和setter方法会变得很麻烦。lBL28资讯网——每日最新资讯28at.com

本文将探讨构建器模式(builder pattern),这是一种允许创建具有许多可选参数的复杂对象的设计模式。lBL28资讯网——每日最新资讯28at.com

lBL28资讯网——每日最新资讯28at.com

我们将介绍基于Go的构建器模式示例实现,并讨论如何创建同一对象的不同变体。lBL28资讯网——每日最新资讯28at.com

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

在Go中实现构建器模式

下面是golang中构建器模式示例:lBL28资讯网——每日最新资讯28at.com

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对象,所以它的所有字段都可以被构建器访问。lBL28资讯网——每日最新资讯28at.com

CarBuilder结构具有设置Car对象可选参数的方法,每个方法返回指向CarBuilder结构体的指针,以允许链式调用。lBL28资讯网——每日最新资讯28at.com

CarBuilder结构体上的Build方法返回指向被构建的Car对象的指针。lBL28资讯网——每日最新资讯28at.com

下面是使用CarBuilder的例子:lBL28资讯网——每日最新资讯28at.com

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: Toyotafmt.Printf("Model: %s/n", car.Model) // Output: Model: Corollafmt.Printf("Year: %d/n", car.Year) // Output: Year: 2021fmt.Printf("Color: %s/n", car.Color) // Output: Color: Redfmt.Printf("Engine Size: %.1f/n", car.EngineSize) // Output: Engine Size: 1.8

在这个例子中,我们创建了一个CarBuilder对象,用它的方法来设置Car对象的可选参数。lBL28资讯网——每日最新资讯28at.com

最后调用Build方法来获取最终的Car对象。然后打印出Car对象的字段,以验证是否设置正确。lBL28资讯网——每日最新资讯28at.com

Go中构建器模式的高级用例

构建器模式有一些高级用例,可以在某些情况下使用。lBL28资讯网——每日最新资讯28at.com

下面介绍Go中构建器模式的一些高级用例。lBL28资讯网——每日最新资讯28at.com

创建构建器接口

在构建器模式基本示例中,有一个用于构建对象的builder结构。lBL28资讯网——每日最新资讯28at.com

不过我们可以创建builder接口,让不同builder结构实现其接口。lBL28资讯网——每日最新资讯28at.com

当我们需要使用相同模式构建不同类型的对象时,这非常有用。lBL28资讯网——每日最新资讯28at.com

假设有两种类型的汽车: 电动汽车和汽油汽车,有相同的可选参数,但有不同的必需参数。lBL28资讯网——每日最新资讯28at.com

在这种情况下,可以创建一个CarBuilder接口,指定构建汽车所需的方法,然后创建两个实现CarBuilder接口的结构: ElectricCarBuilder和GasolineCarBuilder。lBL28资讯网——每日最新资讯28at.com

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接口。lBL28资讯网——每日最新资讯28at.com

然后可以自己实现制造汽车所需的方法。lBL28资讯网——每日最新资讯28at.com

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}

我们因此可以基于接口创建汽车,也可以使用相同的接口做模拟。lBL28资讯网——每日最新资讯28at.com

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,并分别创建了一辆电动车和一辆汽油车。lBL28资讯网——每日最新资讯28at.com

CreateCar函数接受CarBuilder接口,并在最后调用Build方法创建Car对象之前,使用构建器的方法设置必需的字段。lBL28资讯网——每日最新资讯28at.com

参考资料:lBL28资讯网——每日最新资讯28at.com

[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-1a64bc0eb3eelBL28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-60945-0.html在Go中构建复杂对象: 构建器模式指南

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 快速初始化容器化Gin项目

下一篇: 使用 Docker 进行 Go 应用程序引导指南

标签:
  • 热门焦点
  • 线程通讯的三种方法!通俗易懂

    线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 得物效率前端微应用推进过程与思考

    得物效率前端微应用推进过程与思考

    一、背景效率工程随着业务的发展,组织规模的扩大,越来越多的企业开始意识到协作效率对于企业团队的重要性,甚至是决定其在某个行业竞争中突围的关键,是企业长久生存的根本。得物
  • 谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌KDD'23工作:如何提升推荐系统Ranking模型训练稳定性

    谷歌在KDD 2023发表了一篇工作,探索了推荐系统ranking模型的训练稳定性问题,分析了造成训练稳定性存在问题的潜在原因,以及现有的一些提升模型稳定性方法的不足,并提出了一种新
  • 使用LLM插件从命令行访问Llama 2

    使用LLM插件从命令行访问Llama 2

    最近的一个大新闻是Meta AI推出了新的开源授权的大型语言模型Llama 2。这是一项非常重要的进展:Llama 2可免费用于研究和商业用途。(几小时前,swyy发现它已从LLaMA 2更名为Lla
  • 破圈是B站头上的紧箍咒

    破圈是B站头上的紧箍咒

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之每年的暑期档都少不了瞄准追剧女孩们的古偶剧集,2021年有优酷的《山河令》,2022年有爱奇艺的《苍兰诀》,今年却轮到小破站抓住了追
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了“本地生活”入口,位置较深,位于首页的“充值中心”内,目前主要售卖美食相关的
  • 新电商三兄弟,“抖快红”成团!

    新电商三兄弟,“抖快红”成团!

    来源:价值研究所作 者:Hernanderz 随着内容电商的概念兴起,抖音、快手、小红书组成的“新电商三兄弟”成为业内一股不可忽视的势力,给阿里、京东、拼多多带去了巨大压
  • 网传小米汽车开始筛选交付中心 建筑面积不低于3000平方米

    网传小米汽车开始筛选交付中心 建筑面积不低于3000平方米

    7月7日消息,近日有微博网友@长三角行健者爆料称,据经销商集团反馈,小米汽车目前已经开始了交付中心的筛选工作,要求候选场地至少有120个车位,建筑不能低
  • 上海举办人工智能大会活动,建设人工智能新高地

    上海举办人工智能大会活动,建设人工智能新高地

    人工智能大会在上海浦江两岸隆重拉开帷幕,人工智能新技术、新产品、新应用、新理念集中亮相。8月30日晚,作为大会的特色活动之一的上海人工智能发展盛典人工
Top