Czym jest wzorzec projektowy Factory Builder?
sobes.tech AI
Odpowiedź od AI
Wzorzec Factory Builder, a dokładniej Factory Method w połączeniu z Builder, to kombinacja dwóch wzorców, które usprawniają tworzenie złożonych obiektów.
Factory Method definiuje interfejs do tworzenia obiektu, ale pozwala podklasom decydować, którą klasę instancjonować. Deleguje odpowiedzialność za tworzenie obiektu klasom potomnym.
Builder oddziela konstruowanie złożonego obiektu od jego reprezentacji, tak aby ten sam proces konstruowania mógł tworzyć różne reprezentacje. Pozwala na stopniowe tworzenie obiektu, korzystając z łańcucha wywołań metod.
Połączenie tych wzorców najczęściej występuje w scenariuszach, gdzie konieczne jest tworzenie kilku wariantów złożonego obiektu. Factory Method określa jaki typ Buildera ma być użyty, a Builder zajmuje się jak utworzyć obiekt tego typu z różnymi konfiguracjami.
Przykład użycia: Gdy masz hierarchię klas obiektów, które wymagają złożonej inicjalizacji, i chcesz tworzyć te obiekty z różnymi konfiguracjami.
Typowa struktura interakcji:
- Fabrika: Posiada metodę zwracającą instancję konkretnego Buildera w zależności od parametrów wejściowych lub własnego typu.
- Builder: Posiada metody do krokowego ustawiania parametrów złożonego obiektu i końcową metodę
build(), zwracającą gotowy obiekt. - Produkt: Złożony obiekt tworzony przez Buildera.
Zalety:
- Lepsza czytelność i zarządzanie kodem przy tworzeniu złożonych obiektów.
- Elastyczność w tworzeniu różnych konfiguracji tego samego typu obiektu.
- Oddzielenie logiki tworzenia obiektu od jego reprezentacji.
- Ułatwia dodawanie nowych typów produktów (używając Factory Method) lub nowych metod konstrukcji (używając Builder).
Wady:
- Zwiększenie liczby klas w projekcie.
- Może być nadmierne dla prostych obiektów.
Przykład (pseudo-kod):
// Produkt
class ComplexObject {
private String partA;
private int partB;
// prywatny konstruktor
private ComplexObject(String partA, int partB) {
this.partA = partA;
this.partB = partB;
}
// Klasa wewnętrzna 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);
}
}
}
// Fabryka zwracająca 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);
}
}
// Użycie:
// ComplexObject obj1 = ComplexObjectFactory.createDefaultBuilder().build();
// ComplexObject obj2 = ComplexObjectFactory.createSpecialBuilder().setPartA("customA").build();