Skip to content

Instantly share code, notes, and snippets.

@axifive
Forked from vaskoz/builder.go
Last active August 20, 2017 10:01
Show Gist options
  • Save axifive/49c002e72c31ec7180dc2511dfaae511 to your computer and use it in GitHub Desktop.
Save axifive/49c002e72c31ec7180dc2511dfaae511 to your computer and use it in GitHub Desktop.
Go Builder pattern
package car
import "strconv"
type Speed float32
type Color string
type Wheels string
const (
MPH Speed = 1
KPH = 1.60934
)
const (
BlueColor Color = "blue"
GreenColor = "green"
RedColor = "red"
)
const (
SportsWheels Wheels = "sports"
SteelWheels = "steel"
)
type Builder interface {
Paint(Color) Builder
Wheels(Wheels) Builder
TopSpeed(Speed) Builder
Build() Interface
}
type Interface interface {
Drive() string
Stop() string
}
type carBuilder struct {
speed Speed
color Color
wheels Wheels
}
type carObject struct {
topSpeed Speed
color Color
wheels Wheels
}
func NewBulder() Builder {
return &carBuilder{}
}
func (cb *carBuilder) TopSpeed(speed Speed) Builder {
cb.speed = speed
return cb
}
func (cb *carBuilder) Paint(color Color) Builder {
cb.color = color
return cb
}
func (cb *carBuilder) Wheels(wheels Wheels) Builder {
cb.wheels = wheels
return cb
}
func (cb *carBuilder) Build() Interface {
return &carObject{
topSpeed: cb.speed,
color: cb.color,
wheels: cb.wheels,
}
}
func (c *carObject) Drive() string {
return "Driving at speed: " + strconv.FormatFloat(float64(c.topSpeed), 'f', 2, 32)
}
func (c *carObject) Stop() string {
return "Stopping a " + string(c.color) + " car"
}
package main
import (
"fmt"
"carBuilder"
)
func main() {
assembly := car.NewBulder().Paint(car.RedColor)
familyCar := assembly.Wheels(car.SteelWheels).TopSpeed(50 * car.MPH).Build()
fmt.Println(familyCar.Drive())
fmt.Println(familyCar.Stop())
sportsCar := assembly.Paint(car.BlueColor).Wheels(car.SportsWheels).TopSpeed(150 * car.MPH).Build()
fmt.Println(sportsCar.Drive())
fmt.Println(sportsCar.Stop())
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment