forked from AlexanderGrom/go-patterns
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathabstract_factory.go
69 lines (56 loc) · 2.35 KB
/
abstract_factory.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
// Абстрактная фабрика (Abstract Factory)
//
package abstract_factory
// Тип AbstractFactory, описывает интерфейс Абстрактной Фабрики
// по производству газировки.
// Конкретные фабрики должны его реализовать.
type AbstractFactory interface {
createWater(volume float64) AbstractWater
createBottle(volume float64) AbstractBottle
}
// Тип AbstractWater, описывает интерфейс напитка.
type AbstractWater interface {
GetVolume() float64 // Возможность получения объема
}
// Тип AbstractBottle, описывает интерфейс бутылки.
type AbstractBottle interface {
InteractWater(water *CocaColaWater) // Бутылка взаидодействует с напитком
GetBottleVolume() float64 // Возможность получения объема бутылки
GetWaterVolume() float64 // Возможность получения объема напитка в бутылке
}
// Тип CocaColaFactory, реализует фабрику по производству CocaCola.
type CocaColaFactory struct {
}
// Создает воду
func (self *CocaColaFactory) createWater(volume float64) *CocaColaWater {
return &CocaColaWater{volume: volume}
}
// Создает бутылку
func (self *CocaColaFactory) createBottle(volume float64) *CocaColaBottle {
return &CocaColaBottle{volume: volume}
}
// Напиток CocaCola
type CocaColaWater struct {
volume float64 // Объем созданого напитка
}
// Получить объем созданого напитка
func (self *CocaColaWater) GetVolume() float64 {
return self.volume
}
// Бутылка CocaCola
type CocaColaBottle struct {
water *CocaColaWater // Бутылка должна содержать напиток
volume float64 // Объем бутылки
}
// Наливаем напиток в бутылку
func (self *CocaColaBottle) InteractWater(water *CocaColaWater) {
self.water = water
}
// Получить объем бутылки
func (self *CocaColaBottle) GetBottleVolume() float64 {
return self.volume
}
// Получить объем налитого напитка
func (self *CocaColaBottle) GetWaterVolume() float64 {
return self.water.GetVolume()
}