Skip to content

Instantly share code, notes, and snippets.

@humamfauzi
Created August 10, 2018 10:11
Show Gist options
  • Save humamfauzi/57b568d52c26dc21addb56daab070e99 to your computer and use it in GitHub Desktop.
Save humamfauzi/57b568d52c26dc21addb56daab070e99 to your computer and use it in GitHub Desktop.
Builder pattern in Golang
package car
import "fmt"
type Speed float64
const (
MPH Speed = 1
KPH Speed = 1.60934
)
type Color string
const (
BlueColor Color = "blue"
GreenColor = "green"
RedColor = "red"
)
type Wheels string
const (
SportsWheels Wheels = "sports"
SteelWheels = "steel"
)
type VehicleBuilder interface {
Paint(Color) VehicleBuilder
Wheels(Wheels) VehicleBuilder
TopSpeed(Speed) VehicleBuilder
Build() Car
}
type carBuilder struct {
wheels Wheels
color Color
speed Speed
}
func (cb *carBuilder) Paint(c Color) VehicleBuilder {
cb.color = c
return cb
}
func (cb *carBuilder) TopSpeed(s Speed) VehicleBuilder {
cb.speed = s
return cb
}
func (cb *carBuilder) Wheels(w Wheels) VehicleBuilder {
cb.wheels = w
return cb
}
func (cb carBuilder) Build() Car {
return Car{
speed: cb.speed,
color: cb.color,
wheels: cb.wheels,
}
}
func NewBuilder() VehicleBuilder {
return &carBuilder{}
}
type Car struct {
wheels Wheels
color Color
speed Speed
}
func (c Car) Describe() {
fmt.Println("WHEELS! ", c.wheels)
fmt.Println("COLOR! ", c.color)
fmt.Println("SPEED! ", c.speed)
}
// directory/
// L main.go
// L package/
// L builder.go
package main
import (
"./package"
)
func main() {
assembly := car.NewBuilder().Paint(car.RedColor)
familyCar := assembly.Wheels(car.SportsWheels).TopSpeed(50 * car.MPH).Build()
familyCar.Describe()
sportsCar := assembly.Wheels(car.SteelWheels).TopSpeed(150 * car.MPH).Build()
sportsCar.Describe()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment