Skip to content

Commit 1d57dc1

Browse files
author
Mohamed
committed
feat:builder pattern added to design patterns
1 parent 8cf5f63 commit 1d57dc1

File tree

6 files changed

+149
-0
lines changed

6 files changed

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

designpatterns/builder/director.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
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+
}

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)