boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

Golang建造者模式构建复杂对象示例


avatar
作者 2025年9月16日 9

建造者模式适用于复杂对象创建,通过分离构建与表示提升可读性和可维护性;在golang中可通过函数式选项、泛型优化,并在并发环境下为每个goroutine创建独立实例以避免竞态。

Golang建造者模式构建复杂对象示例

建造者模式在 golang 中可以优雅地处理复杂对象的创建,尤其当对象的构造过程涉及多个步骤或者存在多种配置选项时。它将对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

package main  import "fmt"  // Computer 计算机结构体 type Computer struct {     CPU    string     RAM    string     Storage string     GPU    string     USBPorts int     HasBluetooth bool }  // ComputerBuilder 计算机建造者接口 type ComputerBuilder interface {     SetCPU(cpu string) ComputerBuilder     SetRAM(ram string) ComputerBuilder     SetStorage(storage string) ComputerBuilder     SetGPU(gpu string) ComputerBuilder     SetUSBPorts(ports int) ComputerBuilder     SetHasBluetooth(hasBluetooth bool) ComputerBuilder     Build() Computer }  // ConcreteComputerBuilder 具体计算机建造者 type ConcreteComputerBuilder struct {     computer Computer }  // NewConcreteComputerBuilder 创建具体计算机建造者 func NewConcreteComputerBuilder() *ConcreteComputerBuilder {     return &ConcreteComputerBuilder{} }  // SetCPU 设置CPU func (b *ConcreteComputerBuilder) SetCPU(cpu string) ComputerBuilder {     b.computer.CPU = cpu     return b }  // SetRAM 设置RAM func (b *ConcreteComputerBuilder) SetRAM(ram string) ComputerBuilder {     b.computer.RAM = ram     return b }  // SetStorage 设置存储 func (b *ConcreteComputerBuilder) SetStorage(storage string) ComputerBuilder {     b.computer.Storage = storage     return b }  // SetGPU 设置GPU func (b *ConcreteComputerBuilder) SetGPU(gpu string) ComputerBuilder {     b.computer.GPU = gpu     return b }  // SetUSBPorts 设置USB端口 func (b *ConcreteComputerBuilder) SetUSBPorts(ports int) ComputerBuilder {     b.computer.USBPorts = ports     return b }  // SetHasBluetooth 设置是否有蓝牙 func (b *ConcreteComputerBuilder) SetHasBluetooth(hasBluetooth bool) ComputerBuilder {     b.computer.HasBluetooth = hasBluetooth     return b }  // Build 构建计算机 func (b *ConcreteComputerBuilder) Build() Computer {     return b.computer }  // Director 指挥者 type Director struct {     builder ComputerBuilder }  // NewDirector 创建指挥者 func NewDirector(builder ComputerBuilder) *Director {     return &Director{builder: builder} }  // Construct 构建计算机 func (d *Director) Construct() Computer {     d.builder.SetCPU("Intel i9").         SetRAM("32GB").         SetStorage("1TB SSD").         SetGPU("nvidia RTX 3080").         SetUSBPorts(4).         SetHasBluetooth(true)     return d.builder.Build() }   func main() {     builder := NewConcreteComputerBuilder()     director := NewDirector(builder)     computer := director.Construct()      fmt.Printf("CPU: %sn", computer.CPU)     fmt.Printf("RAM: %sn", computer.RAM)     fmt.Printf("Storage: %sn", computer.Storage)     fmt.Printf("GPU: %sn", computer.GPU)     fmt.Printf("USB Ports: %dn", computer.USBPorts)     fmt.Printf("Has Bluetooth: %tn", computer.HasBluetooth)      // 也可以直接使用 Builder     customComputer := NewConcreteComputerBuilder().         SetCPU("amd Ryzen 5").         SetRAM("16GB").         SetStorage("500GB SSD").         Build()      fmt.Printf("nCustom CPU: %sn", customComputer.CPU)     fmt.Printf("Custom RAM: %sn", customComputer.RAM)  }

为什么选择建造者模式而不是直接构造函数

直接构造函数对于简单的对象创建很有效,但当对象有许多可选参数或构建过程复杂时,构造函数会变得臃肿且难以维护。 建造者模式通过将构建逻辑分解为多个步骤,提高了代码的可读性和可维护性。 另外,它还允许你创建不同的对象配置,而无需修改构建代码本身。 想象一下,如果每次要改变计算机配置都要修改构造函数,那将是一场噩梦。

Golang 建造者模式有哪些常见的变体和优化?

可以考虑使用函数式选项模式来进一步简化建造者模式,尤其是在配置项非常多的时候。 另外,可以考虑使用泛型来创建更通用的建造者,使其可以用于构建不同类型的对象。 还有一点,如果构建步骤之间存在依赖关系,可以使用状态模式来管理构建过程的状态。

Golang建造者模式构建复杂对象示例

Hitems

HITEMS是一个AI驱动的创意设计平台,支持一键生成产品

Golang建造者模式构建复杂对象示例118

查看详情 Golang建造者模式构建复杂对象示例

如何在并发环境中使用建造者模式?

在并发环境中使用建造者模式需要特别小心,因为建造者通常会维护内部状态。 最简单的方法是为每个 goroutine 创建一个新的建造者实例,以避免竞态条件。 另外,可以使用互斥锁来保护建造者的内部状态,但这可能会降低性能。 还可以考虑使用原子操作来更新建造者的内部状态,但这只适用于简单的状态更新。 选择哪种方法取决于具体的应用场景和性能要求。

立即学习go语言免费学习笔记(深入)”;



评论(已关闭)

评论已关闭