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.