Skip to main content

Go Example

package main

type director struct {
builder iBuilder
}

func newDirector(b iBuilder) *director {
return &director{
builder: b,
}
}

func (d *director) setBuilder(b iBuilder) {
d.builder = b
}

func (d *director) buildHouse() house {
d.builder.setDoorType()
d.builder.setWindowType()
d.builder.setNumFloor()
return d.builder.getHouse()
}
package main

type house struct {
windowType string
doorType string
floor int
}
package main

type iBuilder interface {
setWindowType()
setDoorType()
setNumFloor()
getHouse() house
}

func getBuilder(builderType string) iBuilder {
if builderType == "normal" {
return &normalBuilder{}
}

if builderType == "igloo" {
return &iglooBuilder{}
}
return nil
}
package main

type iglooBuilder struct {
windowType string
doorType string
floor int
}

func newIglooBuilder() *iglooBuilder {
return &iglooBuilder{}
}

func (b *iglooBuilder) setWindowType() {
b.windowType = "Snow Window"
}

func (b *iglooBuilder) setDoorType() {
b.doorType = "Snow Door"
}

func (b *iglooBuilder) setNumFloor() {
b.floor = 1
}

func (b *iglooBuilder) getHouse() house {
return house{
doorType: b.doorType,
windowType: b.windowType,
floor: b.floor,
}
}
package main

type normalBuilder struct {
windowType string
doorType string
floor int
}

func newNormalBuilder() *normalBuilder {
return &normalBuilder{}
}

func (b *normalBuilder) setWindowType() {
b.windowType = "Wooden Window"
}

func (b *normalBuilder) setDoorType() {
b.doorType = "Wooden Door"
}

func (b *normalBuilder) setNumFloor() {
b.floor = 2
}

func (b *normalBuilder) getHouse() house {
return house{
doorType: b.doorType,
windowType: b.windowType,
floor: b.floor,
}
}
package main

import "fmt"

func main() {
normalBuilder := getBuilder("normal")
iglooBuilder := getBuilder("igloo")

director := newDirector(normalBuilder)
normalHouse := director.buildHouse()

fmt.Printf("Normal House Door Type: %s\n", normalHouse.doorType)
fmt.Printf("Normal House Window Type: %s\n", normalHouse.windowType)
fmt.Printf("Normal House Num Floor: %d\n", normalHouse.floor)

director.setBuilder(iglooBuilder)
iglooHouse := director.buildHouse()

fmt.Printf("\nIgloo House Door Type: %s\n", iglooHouse.doorType)
fmt.Printf("Igloo House Window Type: %s\n", iglooHouse.windowType)
fmt.Printf("Igloo House Num Floor: %d\n", iglooHouse.floor)

}
Normal House Door Type: Wooden Door
Normal House Window Type: Wooden Window
Normal House Num Floor: 2

Igloo House Door Type: Snow Door
Igloo House Window Type: Snow Window
Igloo House Num Floor: 1