Sobes.tech
Middle

გააზიარეთ დიზაინის ნიმუში 'მშენებელი'.

sobes.tech AI

პასუხი AI-სგან

დიზაინის ნიმუში "მშენებელი" (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 = "ნაწილი A აშენდა"
}

func (cb *ConcreteBuilder) BuildPartB() {
	cb.product.PartB = "ნაწილი B აშენდა"
}

func (cb *ConcreteBuilder) BuildPartC() {
	cb.product.PartC = "ნაწილი C აშენდა"
}

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)

უპირატესობები:

  • კოდის გამოყოფა ობიექტის მშენებლობის კოდიდან.
  • საშუალებას აძლევს შეცვალოს პროდუქტის შიდა წარმოდგენა, გარეშე შეცვალოს კლიენტის კოდი.
  • ნაბიჯ-ნაბიჯ მშენებლობა.
  • გამარტივება დიდი რაოდენობით პარამეტრებით ობიექტების შექმნისას.

მოხერხებულობა:

  • ზრდის კლასების/ინტერფეისების რაოდენობას ობიექტის შექმნისთვის.
  • შეიძლება იყოს ზედმეტი მარტივი ობიექტებისთვის.