Middle
Kas ir builder (celtnieks) programmatūras izstrādes kontekstā?
sobes.tech AI
Atbilde no AI
Dizaina paraugs, kas atdala sarežģīta objekta būvniecību no tā prezentācijas, ļaujot izveidot dažādus vienas un tās pašas būvniecības procesa attēlojumus.
Galvenās īpašības:
- Atbildības sadalījums: Objekta veidošanas loģika (būvniecības soļi) un objekta prezentācija (galaprodukts) ir atdalīti.
- Pakāpeniska būvniecība: Objekts tiek būvēts pakāpeniski, padarot procesu elastīgāku un saprotamāku.
- Dažādi attēlojumi: Viens un tas pats būvniecības process var tikt izmantots dažādu objekta variāciju izveidei.
- Inkapusulācija: Būvniecības detaļas ir paslēptas no klienta, kas atvieglo tās izmantošanu.
Galvenie dalībnieki:
- Builder (Būvētājs): Abstrakta saskarne vai klase, kas definē soļus produkta daļu izveidei.
- ConcreteBuilder (Konkrētais būvētājs): Konkrēta būvētāja realizācija, kas veic faktisko daļu būvniecību un saglabā rezultātu.
- Director (Direktors): Klase, kas izmanto ConcreteBuilder objektu produkta būvniecībai, izsaucot atbilstošās būvētāja metodes noteiktā secībā.
- Product (Produkts): Sarežģīts objekts, kas tiek būvēts.
Piemērs:
Izveidot Pizza objektu ar dažādiem sastāvdaļām:
// Produkts
class Pizza {
private String dough;
private String sauce;
private String cheese;
private List<String> toppings;
public void setDough(String dough) { this.dough = dough; }
public void setSauce(String sauce) { this.sauce = sauce; }
public void setCheese(String cheese) { this.cheese = cheese; }
public void addTopping(String topping) {
if (toppings == null) {
toppings = new ArrayList<>();
}
toppings.add(topping);
}
@Override
public String toString() {
return "Pizza with dough: " + dough + ", sauce: " + sauce + ", cheese: " + cheese + ", toppings: " + toppings;
}
}
// Būvētāja saskarne
interface PizzaBuilder {
void buildDough();
void buildSauce();
void buildCheese();
void addTopping(String topping);
Pizza getResult();
}
// Konkrētais būvētājs
class MargheritaPizzaBuilder implements PizzaBuilder {
private Pizza pizza;
public MargheritaPizzaBuilder() {
this.pizza = new Pizza();
}
@Override
public void buildDough() {
pizza.setDough("Plāna mīkla");
}
@Override
public void buildSauce() {
pizza.setSauce("Tomātu mērce");
}
@Override
public void buildCheese() {
pizza.setCheese("Mozzarella");
}
@Override
public void addTopping(String topping) {
// Margherita parasti neiekļauj papildu sastāvdaļas
}
@Override
public Pizza getResult() {
return pizza;
}
}
// Direktors
class Cook {
private PizzaBuilder pizzaBuilder;
public void setPizzaBuilder(PizzaBuilder pb) {
pizzaBuilder = pb;
}
public void constructPizza() {
pizzaBuilder.buildDough();
pizzaBuilder.buildSauce();
pizzaBuilder.buildCheese();
// Papildu sastāvdaļas var pievienot šeit atkarībā no tipa vai prasībām
}
}
// Klienta kods
public class PizzaShop {
public static void main(String[] args) {
Cook cook = new Cook();
PizzaBuilder margheritaBuilder = new MargheritaPizzaBuilder();
cook.setPizzaBuilder(margheritaBuilder);
cook.constructPizza();
Pizza pizza = margheritaBuilder.getResult();
System.out.println(pizza);
}
}
Lietošana, kad:
- Jāizveido sarežģīts objekts ar daudzām izvēles parametriem.
- Objekta būvniecības process ir secīgs un ietver daudz soļus.
- Jāizveido dažādas vienas un tās pašas objekta variācijas, izmantojot vienu un to pašu būvniecības algoritmu.
- Jāizvairās no konstruktoru ar lielu parametru skaitu ("telescoping constructor").
Priekšrocības:
- Uzlabo koda lasāmību un uzturēšanu.
- Nodrošina elastību objektu izveidē.
- Ļauj izveidot nemaināmus objektus.
- Atbrīvo no nepieciešamības daudz konstruktoru.
Trūkumi:
- Var palielināt klases skaitu projektā.
- Prasa sākotnējas projektēšanas pūles.