this repo has no description

:sparkles: (Go) builder pattern

+20
Go/design-patterns/builder/builder.go
··· 1 + package builder 2 + 3 + type IBuilder interface { 4 + setWindowType() 5 + setDoorType() 6 + setNumFloor() 7 + getHouse() House 8 + } 9 + 10 + func getBuilder(builderType string) IBuilder { 11 + if builderType == "normal" { 12 + return newNormalBuilder() 13 + } 14 + 15 + if builderType == "igloo" { 16 + return newIglooBuilder() 17 + } 18 + 19 + return nil 20 + }
+49
Go/design-patterns/builder/builder_test.go
··· 1 + package builder 2 + 3 + import ( 4 + "fmt" 5 + "testing" 6 + ) 7 + 8 + func TestBuilder(t *testing.T) { 9 + 10 + tests := []struct{ 11 + builder string 12 + expected House 13 + }{ 14 + { 15 + builder: "normal", 16 + expected: House{ 17 + windowType: "Wooden Window", 18 + doorType: "Wooden Door", 19 + floor: 2, 20 + }, 21 + }, 22 + { 23 + builder: "igloo", 24 + expected: House{ 25 + windowType: "Snow Window", 26 + doorType: "Snow Door", 27 + floor: 1, 28 + }, 29 + }, 30 + } 31 + 32 + for _, test := range tests { 33 + t.Run(fmt.Sprintf("should create a %s house with a builder using a director", test.builder), func(t *testing.T) { 34 + builder := getBuilder(test.builder) 35 + director := newDirector(builder) 36 + house := director.buildHouse() 37 + 38 + assertHouse(t, house, test.expected) 39 + }) 40 + } 41 + } 42 + 43 + func assertHouse(t testing.TB, got, want House) { 44 + t.Helper() 45 + 46 + if got != want { 47 + t.Errorf("expected house to be %+v, got %+v", want, got) 48 + } 49 + }
+22
Go/design-patterns/builder/director.go
··· 1 + package builder 2 + 3 + type Director struct { 4 + builder IBuilder 5 + } 6 + 7 + func newDirector(b IBuilder) *Director { 8 + return &Director{ 9 + builder: b, 10 + } 11 + } 12 + 13 + func (d *Director) setBuilder(b IBuilder) { 14 + d.builder = b 15 + } 16 + 17 + func (d *Director) buildHouse() House { 18 + d.builder.setDoorType() 19 + d.builder.setWindowType() 20 + d.builder.setNumFloor() 21 + return d.builder.getHouse() 22 + }
+7
Go/design-patterns/builder/house.go
··· 1 + package builder 2 + 3 + type House struct { 4 + windowType string 5 + doorType string 6 + floor int 7 + }
+32
Go/design-patterns/builder/iglooBuilder.go
··· 1 + package builder 2 + 3 + type IglooBuilder struct { 4 + windowType string 5 + doorType string 6 + floor int 7 + } 8 + 9 + func newIglooBuilder() *IglooBuilder { 10 + return &IglooBuilder{} 11 + } 12 + 13 + func (b *IglooBuilder) setWindowType() { 14 + b.windowType = "Snow Window" 15 + } 16 + 17 + func (b *IglooBuilder) setDoorType() { 18 + b.doorType= "Snow Door" 19 + } 20 + 21 + func (b *IglooBuilder) setNumFloor() { 22 + b.floor = 1 23 + } 24 + 25 + func (b *IglooBuilder) getHouse() House { 26 + return House{ 27 + doorType: b.doorType, 28 + windowType: b.windowType, 29 + floor: b.floor, 30 + } 31 + } 32 +
+31
Go/design-patterns/builder/normalBuilder.go
··· 1 + package builder 2 + 3 + type NormalBuilder struct { 4 + windowType string 5 + doorType string 6 + floor int 7 + } 8 + 9 + func newNormalBuilder() *NormalBuilder { 10 + return &NormalBuilder{} 11 + } 12 + 13 + func (b *NormalBuilder) setWindowType() { 14 + b.windowType = "Wooden Window" 15 + } 16 + 17 + func (b *NormalBuilder) setDoorType() { 18 + b.doorType= "Wooden Door" 19 + } 20 + 21 + func (b *NormalBuilder) setNumFloor() { 22 + b.floor = 2 23 + } 24 + 25 + func (b *NormalBuilder) getHouse() House { 26 + return House{ 27 + doorType: b.doorType, 28 + windowType: b.windowType, 29 + floor: b.floor, 30 + } 31 + }