设计模式4:建造者模式

建造者模式是一种设计模式,它主要用于创建复杂的对象。这种模式将构造对象的过程和对象本身的表示分离,使得同样的构造过程可以创建不同的表示。这种模式通常被用于创建具有许多属性或者包含许多成员的对象。

**意图:**将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

**主要解决:**主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

**何时使用:**一些基本部件不会变,而其组合经常变化的时候。

示例

示例1

package main

import "fmt"

// Car struct
type Car struct {
	brand     string
	color     string
	engineType string
	tireType  string
}

// CarBuilder struct
type CarBuilder struct {
	car *Car
}

// NewCarBuilder function
func NewCarBuilder() *CarBuilder {
	return &CarBuilder{&Car{}}
}

// SetBrand function
func (cb *CarBuilder) SetBrand(brand string) *CarBuilder {
	cb.car.brand = brand
	return cb
}

// SetColor function
func (cb *CarBuilder) SetColor(color string) *CarBuilder {
	cb.car.color = color
	return cb
}

// SetEngineType function
func (cb *CarBuilder) SetEngineType(engineType string) *CarBuilder {
	cb.car.engineType = engineType
	return cb
}

// SetTireType function
func (cb *CarBuilder) SetTireType(tireType string) *CarBuilder {
	cb.car.tireType = tireType
	return cb
}

// Build function
func (cb *CarBuilder) Build() *Car {
	return cb.car
}

func main() {
	carBuilder := NewCarBuilder()
	car := carBuilder.SetBrand("Toyota").SetColor("Red").SetEngineType("Hybrid").SetTireType("All-Season").Build()

	fmt.Printf("Car: %+v\n", car)
}

示例2

package rest

type Config struct {
	Host string
	// 其他配置项...
}

type ConfigBuilder struct {
	config *Config
}

func NewConfigBuilder() *ConfigBuilder {
	return &ConfigBuilder{config: &Config{}}
}

func (b *ConfigBuilder) SetHost(host string) *ConfigBuilder {
	b.config.Host = host
	return b
}

// 其他设置方法...

func (b *ConfigBuilder) Build() *Config {
	return b.config
}