Golang: Реализовываем на Го шаблон проектирования Строитель (Builder)

Итак шаблон проектирования Строитель (Builder) отделяет конструирование сложного объекта от его представления, так что в результате одного и того же процесса конструирования могут получаться разные представления.

The intention is to abstract steps of construction of objects so that
different implementations of these steps can construct different representations
of objects.

Рассмотреть вопрос о создании лабиринтов для фантазии игры. Будем делать так же как и в прошлый раз с Абстрактной фабрикой.
Лабиринты являются сложными структуры объекта. Лабиринты состоять из карт сайтов, как дверей, стен и комнат. Сайты картографических бывают различных типов, таких как стандарт, зачарованный или бомбили. Процесс создания лабиринтов должен быть независимым от типа сайтов карте и не нужно менять, когда новые виды дверей, стен и комнат добавляются.Раствор представляет собой интерфейс строитель определении методов для создания частей конечного продукта. Бетонные строители реализуют интерфейс строитель; построить и собрать части; сохранить ссылку на конечный продукт они создают; и обеспечивают средства для извлечения конечного продукта.Директор построить объект с помощью интерфейса строитель.

В дальнейшем мы покажем, как лабиринт со стандартными сайтами карте можно создать с помощью строителя.
Интерфейс MazeBuilder является общий интерфейс строитель конкретные строители реализации. Метод GetMaze обеспечивает доступ к конечному продукту создает застройщик и есть построить метод для каждой части.

type MazeBuilder interface {
GetMaze() *Maze
BuildMaze()
BuildRoom(roomId int)
BuildDoor(roomId, room2 int)
}

Это перечисление показывает декларацию StandardMazeBuilder которые
имеет ссылку на объект Maze (конечного продукта). GetMaze обеспечивает
доступ общественности к конечному продукту.

type StandardMazeBuilder struct {
maze *Maze
}
func (builder *StandardMazeBuilder) GetMaze() *Maze {
return builder.maze
}

BuildMaze, BuildRoom и BuildDoor каждый создать карту сайта в стандартный сорт. BuildMaze инициализирует конечный продукт с новым объектом лабиринт. BuildRoom создает новый номер, если номер не существует. Комната получает четыре стандартные стены. BuildDoor извлекает номера, что дверь для подключения. Новый стандарт дверь вставляется в каждый room.1 Обратите внимание, что каждая функция сборки работает на том же объекте лабиринт. Каждый шаг сборки вносит свой вклад в создание целого конечного продукта.

func (builder *StandardMazeBuilder) BuildMaze() {
builder.maze = NewMaze()
}
func (builder *StandardMazeBuilder) BuildRoom(roomId int) {
if builder.maze.GetRoom(roomId) == nil {
room := NewStandardRoom(roomId)
builder.maze.AddRoom(room)
room.SetSide(North, new(StandardWall))
room.SetSide(East, new(StandardWall))
room.SetSide(South, new(StandardWall))
room.SetSide(West, new(StandardWall))
}
}
func (builder *StandardMazeBuilder) BuildDoor(roomId1 int, roomId2 int) {
room1 := builder.maze.GetRoom(roomId1)
room2 := builder.maze.GetRoom(roomId2)
door := NewStandardDoor(room1, room2)
room1.SetSide(West, door)
room2.SetSide(East, door)
}

BuildMaze использует объект MazeBuilder создать лабиринт. Типы Карта сайта лабиринта зависит от динамического типа объекта застройщика. Метод принимает объект типа MazeBuilder и называет строителя Построить методы. Каждый шаг BuildMaze добавляет часть к конечному продукту
которой объект застройщик отслеживает прочь.

func BuildMaze (builder MazeBuilder) *Maze {
builder.BuildMaze()
builder.BuildRoom(1)
builder.BuildRoom(2)
builder.BuildDoor(1, 2)
return builder.GetMaze()
}

Приведенный ниже код показывает, как клиенты используют строителя, чтобы создать лабиринт со стандартными сайтами карте. Строитель получает экземпляр; объект строитель передается BuildMaze, что создает методы построения лабиринт вызывающего строителя; лабиринт присваивается лабиринт строителя созданный; и, наконец, структура лабиринта печатается на консоль.

builder:= NewStandardMazeBuilder()
BuildMaze(builder)
maze := builder.GetMaze()
fmt.Print(maze)

Шаблоны описывает особый тип директору с методом Construct. Это реализация Builder опускает отдельный тип директора. Задача директора является «построить объект, используя интерфейс Builder». В ГО, это отдельный тип директор не надо. Директора не хранить состояние продукта, ни строителем, которую они используют, чтобы создать продукт. Директор является лишь сосуд для методов построить. Метод режиссера Construct может быть функцией делая вид директор лишнего.
Тем не менее, одним из видов директора могут быть использованы для группирования различных методов строить вместе.
Если общая функциональность между строителями идентифицируется, тип строитель по умолчанию должны быть реализованы. Строитель по умолчанию может также поддерживать ссылку на продукт он создает. Бетонные строители лабиринта бы встроить строитель по умолчанию, чтобы получить общую функциональность и ссылку на продукт.


http://blog.wel.org.ua

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

Leave a Comment

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

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