设计模式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
}