建造者模式

建造者模式

建造者模式(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)
}