forked from AlexanderGrom/go-patterns
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathfactory_method.go
85 lines (69 loc) · 3.11 KB
/
factory_method.go
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
// Паттерн Фабричный метод (FactoryMethod)
//
package factory_method
import (
"log"
)
// Тип Creater, описывает интерфейс,
// который должна реализовать конкретная фабрика
// для производства продуктов.
type Creater interface {
СreateProduct(action string) Producter // Параметризированный Фабричный Метод
registerProduct(Producter) // Регистрация созданого подукта (для полноты картины)
}
// Тип Producter, описывающий интерфейс продукта,
// который возвращает фабрика.
// Все продукты возвращаемые фабрикой должны придерживаться
// единого интерфейса.
type Producter interface {
Use() string // каждый продукт должно быть можно использовать
}
// Тип конкретной фабрики по производству продуктов.
// Она имеет фабричный метод и производит продукты.
type ConcreteCreator struct {
products []*Producter // произведенные продукты (для полноты картины)
}
// Параметризированный Фабричный Метод
func (self *ConcreteCreator) СreateProduct(action string) Producter {
var product Producter
switch action {
case "A":
product = &ConcreteProductA{action}
case "B":
product = &ConcreteProductB{action}
case "C":
product = &ConcreteProductC{action}
default:
log.Fatalln("Unknown Action")
}
self.registerProduct(product)
return product
}
// Регистрация созданого подукта на фабрике
func (self *ConcreteCreator) registerProduct(product Producter) {
self.products = append(self.products, &product)
}
// Тип конкретного продукта "A", который создает фабрика
type ConcreteProductA struct {
action string // Действие которое делает продукт
}
// Продукт можно использовать и получить действие которое он делает
func (self *ConcreteProductA) Use() string {
return self.action
}
// Тип конкретного продукта "B", который создает фабрика
type ConcreteProductB struct {
action string // Действие которое делает продукт
}
// Продукт можно использовать и получить действие которое он делает
func (self *ConcreteProductB) Use() string {
return self.action
}
// Тип конкретного продукта "C", который создает фабрика
type ConcreteProductC struct {
action string // Действие которое делает продукт
}
// Продукт можно использовать и получить действие которое он делает
func (self *ConcreteProductC) Use() string {
return self.action
}