建造者模式(Builder Pattern)是一种创建型设计模式,它允许你分步骤创建复杂对象。
建造者模式让你可以一步步地构造一个复杂的对象,而不需要暴露对象内部的表示细节。
建造者模式还允许你使用相同的构建代码生成不同类型和表示的对象。
下面是一个使用 Go 语言实现的建造者模式的例子。
我们将创建一个 Computer 对象,它包含多个组件(如 CPU、内存、硬盘等)。我们将定义一个 Computer 结构体,一个 Builder 接口,以及具体的建造者实现 StandardComputerBuilder 和 GamingComputerBuilder。
package main
import (
"fmt"
)
// Computer 定义了计算机的结构体
type Computer struct {
CPU string
Memory string
HDD string
GPU string
}
// Builder 定义了建造者接口
type Builder interface {
SetCPU(cpu string) Builder
SetMemory(memory string) Builder
SetHDD(hdd string) Builder
SetGPU(gpu string) Builder
Build() *Computer
}
// StandardComputerBuilder 实现了 Builder 接口
type StandardComputerBuilder struct {
computer *Computer
}
func NewStandardComputerBuilder() *StandardComputerBuilder {
return &StandardComputerBuilder{
computer: &Computer{},
}
}
func (b *StandardComputerBuilder) SetCPU(cpu string) Builder {
b.computer.CPU = cpu
return b
}
func (b *StandardComputerBuilder) SetMemory(memory string) Builder {
b.computer.Memory = memory
return b
}
func (b *StandardComputerBuilder) SetHDD(hdd string) Builder {
b.computer.HDD = hdd
return b
}
func (b *StandardComputerBuilder) SetGPU(gpu string) Builder {
b.computer.GPU = gpu
return b
}
func (b *StandardComputerBuilder) Build() *Computer {
return b.computer
}
// GamingComputerBuilder 实现了 Builder 接口
type GamingComputerBuilder struct {
computer *Computer
}
func NewGamingComputerBuilder() *GamingComputerBuilder {
return &GamingComputerBuilder{
computer: &Computer{},
}
}
func (b *GamingComputerBuilder) SetCPU(cpu string) Builder {
b.computer.CPU = cpu
return b
}
func (b *GamingComputerBuilder) SetMemory(memory string) Builder {
b.computer.Memory = memory
return b
}
func (b *GamingComputerBuilder) SetHDD(hdd string) Builder {
b.computer.HDD = hdd
return b
}
func (b *GamingComputerBuilder) SetGPU(gpu string) Builder {
b.computer.GPU = gpu
return b
}
func (b *GamingComputerBuilder) Build() *Computer {
return b.computer
}
// Director 定义了指导者类
type Director struct {
builder Builder
}
func NewDirector(builder Builder) *Director {
return &Director{
builder: builder,
}
}
func (d *Director) SetBuilder(builder Builder) {
d.builder = builder
}
func (d *Director) BuildComputer() *Computer {
d.builder.SetCPU("Intel i5").SetMemory("16GB").SetHDD("512GB SSD").SetGPU("NVIDIA GTX 1650")
return d.builder.Build()
}
func main() {
director := NewDirector(NewStandardComputerBuilder())
standardComputer := director.BuildComputer()
fmt.Println("Standard Computer:", standardComputer)
director.SetBuilder(NewGamingComputerBuilder())
gamingComputer := director.BuildComputer()
fmt.Println("Gaming Computer:", gamingComputer)
}