Sobes.tech
Middle

"Quruvchi" dizayn shabloni haqida gapiring.

sobes.tech AI

AIdan javob

Dizayn naqshili "Builder" (Quruvchi) - bu yaratuvchi naqsh bo'lib, murakkab obyektlarni bosqichma-bosqich yaratishga imkon beradi. U murakkab obyektni qurish jarayonini uning tasviridan ajratadi, shunday qilib, bir xil qurish jarayoni turli xil tasvirlarni yaratishi mumkin.

Asosiy komponentlar:

  • Quruvchi (Builder): Murakkab obyektning qismlarini yaratish uchun metodlarni belgilovchi interfeys yoki abstrakt sinf.
  • Aniq Quruvchi (Concrete Builder): Quruvchi interfeysini amalga oshiradi va obyekt qismlarini qurish uchun aniq implementatsiya taqdim etadi. U o'rtacha natijani saqlaydi va tayyor obyektni olish uchun metod taqdim etadi.
  • Direktor (Director): Ixtiyoriy komponent. Obyektni yaratish uchun quruvchi metodlarini chaqirish tartibini belgilaydi. Aniq quruvchilarni bilmaydi.
  • Mahsulot (Product): Quruvchi tomonidan yaratilgan murakkab obyekt.

Qo'llanilishi:

  • Obyekt yaratish jarayoni murakkab va ko'plab ixtiyoriy bosqichlarni o'z ichiga olganda.
  • Bir xil qurish jarayonidan foydalanib, turli xil tasvirlarni yaratish zarur bo'lsa.
  • Obyekt quruvchisi ko'p parametrga ega bo'lsa.

Go tilida misol:

// Mahsulot - murakkab obyekt
type Product struct {
	PartA string
	PartB string
	PartC string
}

// Quruvchi - interfeys
type Builder interface {
	BuildPartA()
	BuildPartB()
	BuildPartC()
	GetProduct() *Product
}

// AniqQuruvchi - aniq quruvchi
type ConcreteBuilder struct {
	product *Product
}

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

func (cb *ConcreteBuilder) BuildPartA() {
	cb.product.PartA = "Qism A qurildi"
}

func (cb *ConcreteBuilder) BuildPartB() {
	cb.product.PartB = "Qism B qurildi"
}

func (cb *ConcreteBuilder) BuildPartC() {
	cb.product.PartC = "Qism C qurildi"
}

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

// Direktor - ixtiyoriy
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()
}

// Foydalanish
// concreteBuilder := NewConcreteBuilder()
// director := NewDirector(concreteBuilder)
// director.Construct()
// product := concreteBuilder.GetProduct()
// fmt.Printf("Yaratilgan mahsulot: %+v\n", product)

Afzalliklari:

  • Obyektni qurish kodini mijoz kodidan ajratadi.
  • Mahsulotning ichki tasvirini o'zgartirish imkonini beradi, mijoz kodini o'zgartirmasdan.
  • Obyektni bosqichma-bosqich qurishga imkon beradi.
  • Ko'p parametrli obyektlarni yaratishni soddalashtiradi.

Kamchiliklari:

  • Kodning (sinflar/interfeyslar) sonini oshiradi.
  • Oddiy obyektlar uchun ortiqcha bo'lishi mumkin.