Потрібна крута книжка про патерни та ще й українською? Ось вона »
Будівельник

Будівельник на Go

Будівельник — це породжуючий патерн проектування, який дозволяє створювати об’єкти покроково.

На відміну від інших породжуючих патернів, Будівельник дозволяє виготовляти різні продукти, використовуючи один і той же процес будівництва.

Концептуальний приклад

Патерн Будівельник використовується, коли потрібний продукт складний і вимагає декількох кроків для побудови. У таких випадках кілька конструкторних методів підійдуть краще, ніж один величезний конструктор. Під час використання покрокової побудови об’єктів потенційною проблемою є видача клієнту частково побудованого нестабільного продукту. Патерн Будівельник приховує об’єкт, поки він не буде побудованим до кінця.

Наведений нижче код використовує різні типи будинків ( igloo і normalHouse), які конструюються за допомогою будівельників iglooBuilder та normalBuilder. Під час створення кожного будинку використовуються однакові кроки. Для допомоги в організації процесу можна використовувати директор, хоч це й не є обов’язковим.

iBuilder.go: Інтерфейс будівельника

package main

type iBuilder interface {
	setWindowType()
	setDoorType()
	setNumFloor()
	getHouse() house
}

func getBuilder(builderType string) iBuilder {
	if builderType == "normal" {
		return &normalBuilder{}
	}

	if builderType == "igloo" {
		return &iglooBuilder{}
	}
	return nil
}

normalBuilder.go: Конкретний будівельник

package main

type normalBuilder struct {
	windowType string
	doorType   string
	floor      int
}

func newNormalBuilder() *normalBuilder {
	return &normalBuilder{}
}

func (b *normalBuilder) setWindowType() {
	b.windowType = "Wooden Window"
}

func (b *normalBuilder) setDoorType() {
	b.doorType = "Wooden Door"
}

func (b *normalBuilder) setNumFloor() {
	b.floor = 2
}

func (b *normalBuilder) getHouse() house {
	return house{
		doorType:   b.doorType,
		windowType: b.windowType,
		floor:      b.floor,
	}
}

iglooBuilder.go: Конкретний будівельник

package main

type iglooBuilder struct {
	windowType string
	doorType   string
	floor      int
}

func newIglooBuilder() *iglooBuilder {
	return &iglooBuilder{}
}

func (b *iglooBuilder) setWindowType() {
	b.windowType = "Snow Window"
}

func (b *iglooBuilder) setDoorType() {
	b.doorType = "Snow Door"
}

func (b *iglooBuilder) setNumFloor() {
	b.floor = 1
}

func (b *iglooBuilder) getHouse() house {
	return house{
		doorType:   b.doorType,
		windowType: b.windowType,
		floor:      b.floor,
	}
}

house.go: Продукт

package main

type house struct {
	windowType string
	doorType   string
	floor      int
}

director.go: Директор

package main

type director struct {
	builder iBuilder
}

func newDirector(b iBuilder) *director {
	return &director{
		builder: b,
	}
}

func (d *director) setBuilder(b iBuilder) {
	d.builder = b
}

func (d *director) buildHouse() house {
	d.builder.setDoorType()
	d.builder.setWindowType()
	d.builder.setNumFloor()
	return d.builder.getHouse()
}

main.go: Клієнтський код

package main

import "fmt"

func main() {
	normalBuilder := getBuilder("normal")
	iglooBuilder := getBuilder("igloo")

	director := newDirector(normalBuilder)
	normalHouse := director.buildHouse()

	fmt.Printf("Normal House Door Type: %s\n", normalHouse.doorType)
	fmt.Printf("Normal House Window Type: %s\n", normalHouse.windowType)
	fmt.Printf("Normal House Num Floor: %d\n", normalHouse.floor)

	director.setBuilder(iglooBuilder)
	iglooHouse := director.buildHouse()

	fmt.Printf("\nIgloo House Door Type: %s\n", iglooHouse.doorType)
	fmt.Printf("Igloo House Window Type: %s\n", iglooHouse.windowType)
	fmt.Printf("Igloo House Num Floor: %d\n", iglooHouse.floor)

}

output.txt: Результат виконання

Normal House Door Type: Wooden Door
Normal House Window Type: Wooden Window
Normal House Num Floor: 2

Igloo House Door Type: Snow Door
Igloo House Window Type: Snow Window
Igloo House Num Floor: 1
На основі: Golang By Example

Будівельник іншими мовами програмування

Будівельник на Java Будівельник на C# Будівельник на C++ Будівельник на PHP Будівельник на Python Будівельник на Ruby Будівельник на Swift Будівельник на TypeScript