Co je to návrhový vzor Factory Builder?
sobes.tech AI
Odpověď od AI
Vzor Factory Builder, nebo spíše Factory Method ve spojení s Builderem, je kombinací dvou vzorů, které zlepšují tvorbu složitých objektů.
Factory Method definuje rozhraní pro tvorbu objektu, ale umožňuje podtřídám rozhodnout, jakou třídu instanciovat. Deleguje odpovědnost za tvorbu objektu podtřídám.
Builder odděluje konstrukci složitého objektu od jeho reprezentace, takže stejný konstrukční proces může vytvářet různé reprezentace. Umožňuje krok za krokem vytvářet objekt pomocí řetězce volání metod.
Kombinace těchto vzorů se nejčastěji vyskytuje v scénářích, kde je potřeba vytvořit několik variant složitého objektu. Factory Method určuje, jaký typ Builderu má být použit, a Builder se pak stará o jak vytvořit objekt tohoto typu s různými konfiguracemi.
Příklad použití: Když máte hierarchii tříd objektů, které vyžadují složitou inicializaci, a chcete tyto objekty vytvářet s různými konfiguracemi.
Typická struktura interakce:
- Továrna: Má metodu, která vrací instanci konkrétního Builderu podle vstupních parametrů nebo svého typu.
- Builder: Má metody pro krokové nastavení parametrů složitého objektu a finální metodu
build(), která vrací hotový objekt. - Produkt: Složitý objekt, který je vytvářen Builderem.
Výhody:
- Zlepšená čitelnost a správa kódu při tvorbě složitých objektů.
- Flexibilita při vytváření různých konfigurací téhož typu objektu.
- Oddělení logiky tvorby objektu od jeho prezentace.
- Zjednodušení přidávání nových typů produktů (pomocí Factory Method) nebo nových způsobů konstrukce (pomocí Builderu).
Nevýhody:
- Zvýšení počtu tříd v projektu.
- Může být nadbytečné pro jednoduché objekty.
Příklad (pseudokód):
// Produkt
class ComplexObject {
private String partA;
private int partB;
// privátní konstruktor
private ComplexObject(String partA, int partB) {
this.partA = partA;
this.partB = partB;
}
// Vnitřní třída Builder
public static class Builder {
private String partA;
private int partB;
public Builder setPartA(String partA) {
this.partA = partA;
return this;
}
public Builder setPartB(int partB) {
this.partB = partB;
return this;
}
public ComplexObject build() {
return new ComplexObject(partA, partB);
}
}
}
// Továrna vracející Builder
class ComplexObjectFactory {
public static ComplexObject.Builder createDefaultBuilder() {
return new ComplexObject.Builder()
.setPartA("defaultA")
.setPartB(10);
}
public static ComplexObject.Builder createSpecialBuilder() {
return new ComplexObject.Builder()
.setPartA("specialA")
.setPartB(50);
}
}
// Použití:
// ComplexObject obj1 = ComplexObjectFactory.createDefaultBuilder().build();
// ComplexObject obj2 = ComplexObjectFactory.createSpecialBuilder().setPartA("customA").build();