Sobes.tech
Middle+

Mi az a Factory Builder tervezési minta?

sobes.tech MI

Válasz az MI-től

A Factory Builder minta, vagy inkább a Factory Method kombinációja a Builder-rel, két minta kombinációja, amely javítja összetett objektumok létrehozását.

A Factory Method meghatározza az interfészt az objektum létrehozására, de lehetővé teszi az alosztályok számára, hogy eldöntsék, melyik példányosítandó osztályt használják. A felelősséget az objektum létrehozásáért az alosztályokra delegálja.

A Builder elválasztja egy összetett objektum konstrukcióját annak megjelenítésétől, így ugyanaz a konstrukciós folyamat különböző megjelenítéseket hozhat létre. Lépésenkénti objektumépítést tesz lehetővé, metódushívások láncolásával.

Ezek kombinációja leggyakrabban olyan forgatókönyvekben fordul elő, ahol több változatban kell összetett objektumokat létrehozni. A Factory Method meghatározza, hogy milyen típusú Builder-t kell használni, míg a Builder az hogyan-t végzi el az adott típusú objektum különböző konfigurációkkal való létrehozásában.

Használati példa: Amikor egy objektumhierarchiád van, amely összetett inicializálást igényel, és különböző konfigurációkkal szeretnéd ezeket az objektumokat létrehozni.

Tipikus interakciós struktúra:

  • Gyár: Egy metódust tartalmaz, amely egy adott Builder példányát adja vissza a bemeneti paraméterek vagy a típus szerint.
  • Builder: Metódusokat tartalmaz az összetett objektum paramétereinek lépésenkénti beállítására és a végső build() metódust, amely a kész objektumot adja vissza.
  • Termék: Az összetett objektum, amelyet a Builder hoz létre.

Előnyök:

  • Javított olvashatóság és kezelhetőség a kód összetett objektumok létrehozásakor.
  • Rugalmasság ugyanazon típusú objektum különböző konfigurációinak létrehozásában.
  • Az objektum létrehozási logika elválasztása a megjelenítésétől.
  • Az új típusú termékek (Factory Method használatával) vagy új építési módok (Builder használatával) könnyű hozzáadása.

Hátrányok:

  • A osztályok számának növekedése a projektben.
  • Lehet, hogy túlzás egyszerű objektumok esetén.

Példa (pszeudokód):

// Termék
class ComplexObject {
    private String partA;
    private int partB;

    // privát konstruktor
    private ComplexObject(String partA, int partB) {
        this.partA = partA;
        this.partB = partB;
    }

    // Builder belső osztály
    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);
        }
    }
}

// Gyár, amely Builder-t ad vissza
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);
    }
}

// Használat:
// ComplexObject obj1 = ComplexObjectFactory.createDefaultBuilder().build();
// ComplexObject obj2 = ComplexObjectFactory.createSpecialBuilder().setPartA("customA").build();