Autumn SALE
Budowniczy

Budowniczy w języku Go

Budowniczy to kreacyjny wzorzec projektowy umożliwiający tworzenie złożonych obiektów krok po kroku.

W przeciwieństwie do innych wzorców kreacyjnych Budowniczy nie zakłada definiowania wspólnego interfejsu dla produktów. Dzięki temu da się wytwarzać różne produkty stosując ten sam proces konstrukcyjny.

Przykład koncepcyjny

Wzorzec Budowniczy stosuje się również wtedy, gdy żądany produkt jest złożony, a jego produkcja odbywa się etapami. W takim przypadku prościej byłoby mieć kilka metod konstrukcyjnych zamiast jednego wielkiego konstruktora. Potencjalnym problemem z wieloetapowym podejściem jest to, że klient może uzyskać niezamierzony dostęp do niedokończonego i niestabilnego produktu. Wzorzec Budowniczy chroni produkt przed dostępem aż do jego pełnego ukończenia.

W poniższym kodzie mamy różne rodzaje domów (igloo i normalHouse) — konstruowane przez iglooBuilder i normalBuilder. Każdy rodzaj domu powstaje według takich samych etapów. Opcjonalna struktura kierownik ułatwia zorganizowanie procesu budowy.

iBuilder.go: Interfejs budowniczego

package main type IBuilder interface {	setWindowType()	setDoorType()	setNumFloor()	getHouse() House } func getBuilder(builderType string) IBuilder {	if builderType == "normal" {	return newNormalBuilder()	}	if builderType == "igloo" {	return newIglooBuilder()	}	return nil } 

normalBuilder.go: Konkretny budowniczy

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: Konkretny budowniczy

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: Produkt

package main type House struct {	windowType string	doorType string	floor int } 

director.go: Kierownik

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: Kod klienta

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: Wynik działania

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 
Na podstawie: Golang By Example

Budowniczy w innych językach

Budowniczy w języku C# Budowniczy w języku C++ Budowniczy w języku Java Budowniczy w języku PHP Budowniczy w języku Python Budowniczy w języku Ruby Budowniczy w języku Rust Budowniczy w języku Swift Budowniczy w języku TypeScript