Skip to content

Commit 9d4fcc1

Browse files
Merge pull request #285 from mohamed-abdelrhman/master
feat:factory method pattern added to designpatterns
2 parents ae2d674 + 8cf5f63 commit 9d4fcc1

File tree

6 files changed

+115
-0
lines changed

6 files changed

+115
-0
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package factorymethod
2+
3+
type accounting struct {
4+
department
5+
}
6+
7+
func newAccounting() iDepartment {
8+
return &accounting{
9+
department: department{
10+
name: "Accounting Department",
11+
employees: 1,
12+
},
13+
}
14+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package factorymethod
2+
3+
type department struct {
4+
name string
5+
employees int
6+
}
7+
8+
9+
func (g *department) setName(name string) {
10+
g.name = name
11+
}
12+
13+
func (g *department) getName() string {
14+
return g.name
15+
}
16+
17+
func (g *department) setEmployees(employees int) {
18+
g.employees = employees
19+
}
20+
21+
func (g *department) getEmployees() int {
22+
return g.employees
23+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package factorymethod
2+
3+
import "fmt"
4+
5+
func getDepartment(departmentType string) (iDepartment, error) {
6+
if departmentType == "accounting" {
7+
return newAccounting(), nil
8+
}
9+
if departmentType == "finance" {
10+
return newFinance(), nil
11+
}
12+
return nil, fmt.Errorf("wrong department type passed")
13+
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package factorymethod
2+
3+
import (
4+
"reflect"
5+
"testing"
6+
)
7+
8+
// test client code and how to use the factory
9+
func TestFactoryMethod(t *testing.T) {
10+
t.Run("Test Accounting Department", func(t *testing.T) {
11+
accounting, _ := getDepartment("accounting")
12+
if !reflect.DeepEqual(accounting.getName(), "Accounting Department") {
13+
t.Errorf("got: %v, want: %v", accounting.getName(), "Accounting Department")
14+
}
15+
if !reflect.DeepEqual(accounting.getEmployees(), 1) {
16+
t.Errorf("got: %v, want: %v", accounting.getName(), 1)
17+
}
18+
})
19+
20+
21+
t.Run("Test Finance Department", func(t *testing.T) {
22+
finance, _ := getDepartment("finance")
23+
if !reflect.DeepEqual(finance.getName(), "Finance Department") {
24+
t.Errorf("got: %v, want: %v", finance.getName(), "Finance Department")
25+
}
26+
if !reflect.DeepEqual(finance.getEmployees(), 2) {
27+
t.Errorf("got: %v, want: %v", finance.getEmployees(), 2)
28+
}
29+
})
30+
31+
t.Run("Test not existing department", func(t *testing.T) {
32+
random, _ := getDepartment("test")
33+
34+
if !reflect.DeepEqual(random, nil) {
35+
t.Errorf("should return empty nil for non existing department")
36+
}
37+
38+
})
39+
}
40+
41+
42+
43+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package factorymethod
2+
3+
type finance struct {
4+
department
5+
}
6+
7+
func newFinance() iDepartment {
8+
return &finance{
9+
department: department{
10+
name: "Finance Department",
11+
employees: 2,
12+
},
13+
}
14+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package factorymethod
2+
3+
type iDepartment interface {
4+
setName(name string)
5+
setEmployees(employees int)
6+
getName() string
7+
getEmployees() int
8+
}

0 commit comments

Comments
 (0)