Sobes.tech
Middle

Испричајте о шаблону дизајна 'Градитељ'.

sobes.tech АИ

Одговор од АИ

Шаблон за пројектовање "Градитељ" (Builder) је патерн за стварање који омогућава корак по корак креирање сложених објеката. Он одваја процес конструисања сложеног објекта од његовог приказа, тако да исти процес изградње може креирати различита приказивања.

Главне компоненте:

  • Градитељ (Builder): Интерфејс или апстрактна класа која дефинише методе за креирање делова сложеног објекта.
  • Конкретни Градитељ (Concrete Builder): Реализује интерфејс Градитеља и пружа конкретну реализацију за изградњу делова објекта. Чува међузбир и пружа метод за добијање готовог производа.
  • Директор (Director): Необавезна компонента. Одређује редослед позива метода градитеља за креирање објекта. Не зна за конкретне градитеље.
  • Производ (Product): Сложен објекат који се креира градитељ.

Примена:

  • Када је процес креирања објекта сложен и укључује много опционих корака.
  • Када је потребно креирати различита приказивања истог објекта користећи исти процес изградње.
  • Када конструктор објекта има велики број параметара.

Пример у Go:

// Производ - сложен објекат
type Product struct {
	PartA string
	PartB string
	PartC string
}

// Градитељ - интерфејс
type Builder interface {
	BuildPartA()
	BuildPartB()
	BuildPartC()
	GetProduct() *Product
}

// Конкретни Градитељ
type ConcreteBuilder struct {
	product *Product
}

func NewConcreteBuilder() *ConcreteBuilder {
	return &ConcreteBuilder{product: &Product{}}
}

func (cb *ConcreteBuilder) BuildPartA() {
	cb.product.PartA = "Део А је изграђен"
}

func (cb *ConcreteBuilder) BuildPartB() {
	cb.product.PartB = "Део Б је изграђен"
}

func (cb *ConcreteBuilder) BuildPartC() {
	cb.product.PartC = "Део Ц је изграђен"
}

func (cb *ConcreteBuilder) GetProduct() *Product {
	return cb.product
}

// Директор - опционално)
type Director struct {
	builder Builder
}

func NewDirector(builder Builder) *Director {
	return &Director{builder: builder}
}

func (d *Director) Construct() {
	d.builder.BuildPartA()
	d.builder.BuildPartB()
	d.builder.BuildPartC()
}

// Коришћење
// concreteBuilder := NewConcreteBuilder()
// director := NewDirector(concreteBuilder)
// director.Construct()
// product := concreteBuilder.GetProduct()
// fmt.Printf("Креирани производ: %+v\n", product)

Предности:

  • Изоловање кода изградње објекта од његовог клијентског кода.
  • Омогућава промену унутрашњег приказа производа без промене клијентског кода.
  • Омогућава корак по корак изградњу објекта.
  • Олакшава креирање објеката са великим бројем параметара.

Недостаци:

  • Повећава број класа/интерфејса за креирање објекта.
  • Може бити вишак за једноставне објекте.