+20
Go/design-patterns/builder/builder.go
+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
+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
+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
+7
Go/design-patterns/builder/house.go
+32
Go/design-patterns/builder/iglooBuilder.go
+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
+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
+
}