-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathsimplyfactory.go
More file actions
96 lines (79 loc) · 1.85 KB
/
simplyfactory.go
File metadata and controls
96 lines (79 loc) · 1.85 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package ch1
import "fmt"
type OperationSFactory[T float64 | int64 | float32 | int] interface {
CreateOperation(operator string) Operation[T]
}
type Operation[T float64 | int64 | float32 | int] interface {
SetNumber1(number T)
SetNumber2(number T)
GetResult() T
}
type OperationBase[T float64 | int64 | float32 | int] struct {
Number1 T
Number2 T
}
type simpleFactory[T float64 | int64 | float32 | int] struct {
}
// add operator still need modify this
func (s *simpleFactory[T]) CreateOperation(operator string) Operation[T] {
switch operator {
case "+":
return &OperationAdd[T]{}
case "-":
return &OperationSub[T]{}
case "*":
return &OperationMul[T]{}
case "/":
return &OperationDiv[T]{}
default:
return nil
}
}
func (o *OperationBase[T]) SetNumber1(number T) {
o.Number1 = number
}
func (o *OperationBase[T]) SetNumber2(number T) {
o.Number2 = number
}
// add
type OperationAdd[T float64 | int64 | float32 | int] struct {
OperationBase[T]
}
func (o *OperationAdd[T]) GetResult() T {
return o.Number1 + o.Number2
}
// sub
type OperationSub[T float64 | int64 | float32 | int] struct {
OperationBase[T]
}
func (o *OperationSub[T]) GetResult() T {
return o.Number1 - o.Number2
}
// mul
type OperationMul[T float64 | int64 | float32 | int] struct {
OperationBase[T]
}
func (o *OperationMul[T]) GetResult() T {
return o.Number1 * o.Number2
}
// div
type OperationDiv[T float64 | int64 | float32 | int] struct {
OperationBase[T]
}
func (o *OperationDiv[T]) GetResult() T {
if o.Number2 == 0 {
return 0
}
return o.Number1 / o.Number2
}
func Run[T float64 | int64 | float32 | int](num1, num2 T, operator string) T {
simpleFactory := &simpleFactory[T]{}
oper := simpleFactory.CreateOperation(operator)
if oper == nil {
fmt.Println("operator is not supported")
return 0
}
oper.SetNumber1(num1)
oper.SetNumber2(num2)
return oper.GetResult()
}