package main import ( "fmt" ) type Director struct { builder Builder } func (d *Director) SetBuilder(builder Builder) { d.builder = builder } func (d *Director) Generate() *Car { d.builder.NewProduct() d.builder.BuildChassis() d.builder.BuildSeat() d.builder.BuildWheels() return d.builder.GetResult().(*Car) } type Car struct { Wheels string Chassis string Seat string } func (c *Car) Show() { fmt.Printf("\n%s\n%s\n%s\n", c.Wheels, c.Chassis, c.Seat) } type Builder interface { NewProduct() BuildWheels() BuildChassis() BuildSeat() GetResult() interface{} } type CarBuilder struct { Car *Car } func (cb *CarBuilder) GetResult() interface{} { return cb.Car } func (cb *CarBuilder) NewProduct() { cb.Car = new(Car) } func (cb *CarBuilder) BuildWheels() { cb.Car.Wheels = "build wheels" } func (cb *CarBuilder) BuildChassis() { cb.Car.Chassis = "build chassis" } func (cb *CarBuilder) BuildSeat() { cb.Car.Seat = "build seat" } func main() { // 创建一个指挥者 director := new(Director) // 创建建造者 builder := new(CarBuilder) director.SetBuilder(builder) car := director.Generate() car.Show() }