Skip to content

Commit 20a3d10

Browse files
Merge pull request #292 from mohamed-abdelrhman/master
feat:builder pattern added to design patterns
2 parents 10a89df + 050ac92 commit 20a3d10

File tree

6 files changed

+161
-0
lines changed

6 files changed

+161
-0
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
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+
return nil
19+
}
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package builder
2+
import (
3+
"fmt"
4+
"reflect"
5+
"testing"
6+
)
7+
8+
func TestBuilderPatter(t *testing.T){
9+
t.Run("Test Normal Builder", func(t *testing.T) {
10+
normalBuilder := getBuilder("normal")
11+
director := newDirector(normalBuilder)
12+
normalHouse := director.buildHouse()
13+
if !reflect.DeepEqual(normalHouse.doorType, "Wooden Door") {
14+
t.Errorf("got: %v, want: %v", normalHouse.doorType, "Wooden Door")
15+
}
16+
if !reflect.DeepEqual(normalHouse.windowType, "Wooden Window") {
17+
t.Errorf("got: %v, want: %v", normalHouse.windowType, "Wooden Window")
18+
}
19+
if !reflect.DeepEqual(normalHouse.floor, 2) {
20+
t.Errorf("got: %v, want: %v", normalHouse.floor, 2)
21+
}
22+
})
23+
t.Run("Test Igloo Builder", func(t *testing.T) {
24+
iglooBuilder := getBuilder("igloo")
25+
director := newDirector(iglooBuilder)
26+
iglooHouse := director.buildHouse()
27+
if !reflect.DeepEqual(iglooHouse.doorType, "Snow Door") {
28+
t.Errorf("got: %v, want: %v", iglooHouse.doorType, "Snow Door")
29+
}
30+
if !reflect.DeepEqual(iglooHouse.windowType, "Snow Window") {
31+
t.Errorf("got: %v, want: %v", iglooHouse.windowType, "Snow Window")
32+
}
33+
if !reflect.DeepEqual(iglooHouse.floor, 1) {
34+
t.Errorf("got: %v, want: %v", iglooHouse.floor, 1)
35+
}
36+
})
37+
38+
t.Run("Test set builder ", func(t *testing.T) {
39+
iglooBuilder := getBuilder("igloo")
40+
director := director{}
41+
director.setBuilder(iglooBuilder)
42+
iglooHouse := director.buildHouse()
43+
fmt.Println(iglooHouse)
44+
if !reflect.DeepEqual(iglooHouse.floor, 1) {
45+
t.Errorf("got: %v, want: %v", iglooHouse.floor, 1)
46+
}
47+
48+
})
49+
50+
}
51+
52+

designpatterns/builder/director.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
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+
func (d *director) setBuilder(b iBuilder) {
13+
d.builder = b
14+
}
15+
16+
func (d *director) buildHouse() house {
17+
d.builder.setDoorType()
18+
d.builder.setWindowType()
19+
d.builder.setNumFloor()
20+
return d.builder.getHouse()
21+
}

designpatterns/builder/house.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package builder
2+
3+
type house struct {
4+
windowType string
5+
doorType string
6+
floor int
7+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
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+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
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+
}

0 commit comments

Comments
 (0)