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 = "Ա մաս կառուցված է"
}

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)

Առավելություններ՝

  • Կոդը կառուցման օբյեկտից առանձնացնում է հաճախորդի կոդից:
  • Ինքնուրույն փոփոխում է արտադրանքի ներքին ներկայացումը՝ առանց հաճախորդի կոդը փոխելու:
  • Կատարում է քայլ առ քայլ կառուցում:
  • Պարզեցնում է մեծ քանակությամբ պարամետրերով օբյեկտների ստեղծումը:

Թերություններ՝

  • Բարձրացնում է դասերի/ինտերֆեյսների քանակը օբյեկտ ստեղծելու համար:
  • Կարող է ավելորդ լինել պարզ օբյեկտների համար:

hy-armenian: