一、目录
二、简介
1. 解决的问题
Builder模式将复杂对象的构造与其表示分离开来,以便相同的构造过程可以创建不同的表示。
三、实现
1. 文件结构
.
├── car
│ └── car.go
├── demoBuilder
│ └── demoBuilder.go
└── main.go
复制代码
2. 具体实现
./car/car.go
package car
type Speed float64
const (
MPH Speed = 1
KPH = 1.60934
)
type Color string
const (
BlueColor Color = "blue"
GreenColor = "green"
RedColor = "red"
)
type Wheels string
const (
SportsWheels Wheels = "sports"
SteelWheels = "steel"
)
type Builder interface {
SetColor(Color) Builder
SetWheels(Wheels) Builder
SetTopSpeed(Speed) Builder
Build() Interface
}
type Interface interface {
Drive() error
Stop() error
}
复制代码
./demoBuilder/demoBuilder.go
package demoBuilder
import (
"fmt"
"study/test/7/car"
)
type demoBuilder struct {
name string
color car.Color
wheels car.Wheels
speed car.Speed
}
func NewBuilder(name string) demoBuilder {
return demoBuilder{name: name}
}
type OptCarA struct {
car demoBuilder
}
func (o OptCarA) Drive() error {
fmt.Printf("The %s, %s, %f car is moving. builder is %s.\n",
o.car.color, o.car.wheels, o.car.speed, o.car.name)
return nil
}
func (o OptCarA) Stop() error {
fmt.Printf("The %s, %s, %f car has stopped. builder is %s.\n",
o.car.color, o.car.wheels, o.car.speed, o.car.name)
return nil
}
func (c demoBuilder) SetColor(color car.Color) demoBuilder {
c.color = color
return c
}
func (c demoBuilder) SetWheels(wheels car.Wheels) demoBuilder {
c.wheels = wheels
return c
}
func (c demoBuilder) SetTopSpeed(speed car.Speed) demoBuilder {
c.speed = speed
return c
}
func (c demoBuilder) Build() OptCarA {
fmt.Printf("build finish\n")
return OptCarA{car: c}
}
复制代码
./main.go
package main
import (
"study/test/7/car"
"study/test/7/demoBuilder"
)
func main() {
assembly := demoBuilder.NewBuilder("myCarBuilder").SetColor(car.RedColor)
familyCar := assembly.SetWheels(car.SportsWheels).SetTopSpeed(50 * car.MPH).Build()
familyCar.Drive()
familyCar.Stop()
sportsCar := assembly.SetWheels(car.SteelWheels).SetTopSpeed(150 * car.MPH).Build()
sportsCar.Drive()
sportsCar.Stop()
}
复制代码
3. 运行
[root@localhost gopath]# go run main.go
build finish
The red, sports, 50.000000 car is moving. builder is myCarBuilder.
The red, sports, 50.000000 car has stopped. builder is myCarBuilder.
build finish
The red, steel, 150.000000 car is moving. builder is myCarBuilder.
The red, steel, 150.000000 car has stopped. builder is myCarBuilder.
复制代码