Golang: Реализовываем на Го шаблон проектирования Абстрактная фабрика (Abstract Factory)

Итак если покапаться в англоязычной литературе

Golang: Abstract Factory
Insulate the creation of families of objects from their usage without
specifying their concrete types.

Абстрактная фабрика — порождающий шаблон проектирования, позволяющий изменять поведение системы, варьируя создаваемыми объектами, при этом сохраняя интерфейсы. Он позволяет создавать целые группы взаимосвязанных объектов, которые, будучи созданными одной фабрикой, реализуют общее поведение

Рассмотрим создание лабиринты для игры. Лабиринты могут прийти в Разнообразие видов, таких как зачарованные или взорванных лабиринты. Лабиринт состоит из картографических сайтов, как комнаты, стены и двери. Создание экземпляров правильный тип карты Сайты по всему применения делает его трудно изменить тип лабиринта. Решение представляет собой интерфейс фабрики, который определяет методы для создания экземпляра каждого интерфейса, который представляет собой карту сайта.
maze

Каждый (двери, стены, номер) является Abstract product.Concrete
factories реализуют методы для создания экземпляров конкретных видов Карта сайта(map site) для того же типа лабиринта.Очарованный завод создает лабиринт с заколдованных номеров, заколдованных дверей и заколдованный стене.

Пример: В следующем примере показано, как лабиринт с bombed картой могут быть созданы с помощью фабрики.
Следующий листинг показывает четыре интерфейса. На этом сайте определяет Enter Метод. Другие интерфейсы включают MapSite — набирает Enter — и список
дальнейшие методы. Это означает, что конкретные двери, комнаты и стены должны выполнить их соответствующие методы и Enter.

type MapSite interface {
Enter()
}
type Wall interface {
MapSite
}
type Door interface {
MapSite
IsOpen() bool
SetOpen(isOpen bool)
}
type Room interface {
MapSite
GetSide(direction Direction) MapSite
SetSide(direction Direction, side MapSite)
SetRoomId(roomId int)
GetRoomId() int
}

BombedDoor является конкретным продуктом, реализация интерфейса двери.
BombedDoor держит ссылки на его смежных комнат и знает
если он открыт или нет.

type BombedDoor struct {
room1 Room
room2 Room
isOpen bool
}

NewBombedDoor экземпляр объекта BombedDoor и устанавливает свои номера.
IsOpen инициализируется ложь по-умолчанию.

func NewBombedDoor(room1 Room, room2 Room) *BombedDoor {
return &BombedDoor{room1: room1, room2: room2}
}

IsOpen и SetOpen являются Методы получения и установки для IsOpen.

func (door *BombedDoor) IsOpen() bool {
return door.isOpen
}
func (door *BombedDoor) SetOpen(isOpen bool) {
door.isOpen = isOpen
}

Введите печатает сообщение в соответствии с IsOpen.

func (door *BombedDoor) Enter() {
if door.isOpen {
fmt.Println("Enter bombed door")
} else {
fmt.Println("Can’t enter bombed door. Closed.")
}
}

Строка возвращает строку, описывающую дверь. Имя метода Строка
есть соглашение. Пакет форматирование FMT GO использует интерфейс Stringer
с цепочкой в ​​качестве единственного метода. Идея в том, что типы реализации
Строка может быть использован в пакете FMT для печати форматированного. Строка
эквивалентно ToString Java.

func (door *BombedDoor) String() string {
return fmt.Sprintf("A bombed door between %v and %v",
door.room1.GetRoomId(), door.room2.GetRoomId())
}

Следующий листинг показывает тип лабиринт, который поддерживает вектор. Вектор не является универсальным и его элементы могут быть любого типа, точнее любой тип реализации (пустой) интерфейс интерфейса. Два других метода ручка добавления и поиска номеров из объекта лабиринт.

type Maze struct {
rooms *vector.Vector
}
func NewMaze() *Maze {
return &Maze{rooms: new(vector.Vector)}
}
func (maze *Maze) AddRoom(room Room) {
maze.rooms.Push(room)
}
func (maze *Maze) GetRoom(roomId int) Room {
for i := 0; i < maze.rooms.Len(); i++ {
currentRoom := maze.rooms.At(i).(Room)
if currentRoom.GetRoomId() == roomId {
return currentRoom
}
}
return nil
}

MazeFactory является интерфейсом листинг метод для каждого Аннотация продукта.

type MazeFactory interface {
MakeMaze() *Maze
MakeWall() Wall
MakeRoom(roomNo int) Room
MakeDoor(room1 Room, room2 Room) Door
}

BombedMazeFactory является реализацией интерфейса MazeFactory. MakeMaze возвращает экземпляр простой лабиринт. Каждый из других методов возвращения экземпляр бомбили семейства продуктов. MakeWall, например, возвращает экземпляр BombedWall. Статические типы возвращаемых объектов типа интерфейса, но динамические типы имеют бомбили разнообразием. Она прозрачна для клиентов методов получения, который возвращается динамический тип.

type BombedMazeFactory struct{}
func (factory *BombedMazeFactory) MakeMaze() *Maze {
return NewMaze()
}
func (factory *BombedMazeFactory) MakeWall() Wall {
return new(BombedWall)
}
func (factory *BombedMazeFactory) MakeRoom(roomNo int) Room {
return NewBombedRoom(roomNo)
}
func (factory *BombedMazeFactory) MakeDoor(room1 Room, room2 Room) Door {
return NewBombedDoor(room1, room2)
}

Функция CreateMaze создает экземпляр лабиринт и возвращает указатель на объект. Лабиринт состоит из двух комнат с дверью между ними. Конкретные виды Карта сайта зависит динамический тип параметра MazeFactory (т.е. рассмотреть завод существо типа BombedFactory, то комнаты, двери и стены будут из взорванного семейства продуктов).

func CreateMaze(factory MazeFactory) *Maze {
aMaze := factory.MakeMaze()
room1 := factory.MakeRoom(1)
room2 := factory.MakeRoom(2)
aDoor := factory.MakeDoor(room1, room2)
aMaze.AddRoom(room1)
aMaze.AddRoom(room2)
room1.SetSide(North, factory.MakeWall())
room1.SetSide(East, aDoor)
room1.SetSide(South, factory.MakeWall())
room1.SetSide(West, factory.MakeWall())
room2.SetSide(North, factory.MakeWall())
room2.SetSide(East, factory.MakeWall())
room2.SetSide(South, factory.MakeWall())
room2.SetSide(West, aDoor)
return aMaze
}

Здесь мы покажем, как клиенты используют бомбили лабиринт завод, чтобы создать лабиринт.

var factory *BombedMazeFactory
var maze *Maze
maze = CreateMaze(factory)
maze.GetRoom(1).Enter() //Prints: Can’t enter bombed door. Closed.

Интерфейсы Wall, дверей и номер вставлять На этом сайте
Интерфейс. На этом сайте Enter, добавляется вложении интерфейсов. Встраивание интерфейс в другой интерфейс похож на расширение интерфейса Java.
Тип заводская может обеспечить общее поведение бетона
заводы. Бетонные заводы будут вставлять по умолчанию завод. завод
Интерфейс со встроенным типа по умолчанию эмулирует абстрактные типы.
Abstract Factory шаблон описывает Создать метод принятия
Завод объект. Метод использует фабрику для создания и возврата конец
Продукт. Из структурной схемы рисунка Abstract Factory в качестве
описывается GoF это не очевидно, где этот метод, как предполагается,
жить. Функции в ГО не привязаны к типу, как в Java или C ++. функции
независимы.Abstract Factory картина может воспользоваться этим.
Там нет необходимости вводить отдельный тип просто провести метода Create.
Создать могут быть просто функцию, так как приемник этой функции не будет
использовать в любом случае.


http://blog.wel.org.ua

работаю админом, прогером сеошнегом :)

Leave a Comment

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Загрузка...
Menu Title