Middle
Mis on builder (ehitaja) tarkvaraarenduse kontekstis?
sobes.tech AI
Vastus AI-lt
Disaino šablons, 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 būvniecības 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: Viena un tā pati būvniecības procesa var izmantot dažādu objekta variāciju izveidei.
- Inkapusulācija: Būvniecības detaļas ir paslēptas no klienta, kas atvieglo to izmantošanu.
Galvenie dalībnieki:
- Builder (Būvētājs): Abstrakta saskarne vai klase, kas definē soļus produkta daļu izveidei.
- ConcreteBuilder (Konkretā 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 skaitā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:
- Gali palielināt klases skaitu projektā.
- Prasa sākotnējas projektēšanas pūles.