Sobes.tech
Middle+

Čo je to návrhový vzor Factory Builder?

sobes.tech AI

Odpoveď od AI

Vzor Factory Builder, alebo skôr Factory Method v spojení s Builderom, je kombináciou dvoch vzorov, ktoré zlepšujú tvorbu zložitých objektov.

Factory Method definuje rozhranie pre tvorbu objektu, ale umožňuje podtriedam rozhodnúť, ktorú triedu inštancovať. Deleguje zodpovednosť za tvorbu objektu na podtriedy.

Builder oddelí konštrukciu zložitých objektov od ich prezentácie, takže rovnaký konštrukčný proces môže vytvárať rôzne prezentácie. Umožňuje krok za krokom vytvárať objekt pomocou reťazca volaní metód.

Kombinácia týchto vzorov sa najčastejšie vyskytuje v scenároch, kde je potrebné vytvoriť niekoľko variantov zložitých objektov. Factory Method určuje ktorý typ Buildera má byť použitý, a Builder sa potom stará o ako vytvoriť objekt tohto typu s rôznymi konfiguráciami.

Príklad použitia: Keď máte hierarchiu tried objektov, ktoré vyžadujú zložitú inicializáciu, a chcete tieto objekty vytvárať s rôznymi konfiguráciami.

Typická štruktúra interakcie:

  • Továrňa: Má metódu, ktorá vracia inštanciu konkrétneho Buildera podľa vstupných parametrov alebo typu.
  • Builder: Má metódy na krokové nastavenie parametrov zložitých objektov a finálnu metódu build(), ktorá vracia hotový objekt.
  • Produkt: Zložitý objekt, ktorý je vytváraný Builderom.

Výhody:

  • Zlepšená čitateľnosť a správa kódu pri tvorbe zložitých objektov.
  • Flexibilita pri vytváraní rôznych konfigurácií toho istého typu objektu.
  • Oddelenie logiky tvorby objektu od jeho prezentácie.
  • Uľahčenie pridávania nových typov produktov (pomocou Factory Method) alebo nových spôsobov konštrukcie (pomocou Buildera).

Nevýhody:

  • Zvýšenie počtu tried v projekte.
  • Môže byť nadbytočné pre jednoduché objekty.

Príklad (pseudokód):

// Produkt
class ComplexObject {
    private String partA;
    private int partB;

    // súkromný konštruktor
    private ComplexObject(String partA, int partB) {
        this.partA = partA;
        this.partB = partB;
    }

    // Vnútorná trieda 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árňa, ktorá vracia 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žitie:
// ComplexObject obj1 = ComplexObjectFactory.createDefaultBuilder().build();
// ComplexObject obj2 = ComplexObjectFactory.createSpecialBuilder().setPartA("customA").build();