Java Academy · Oppitunti

Factory Method -suunnittelumalli

Määritä factory-metodi kantaluokassa ja anna aliluokkien päättää, mikä tuote luodaan.

Oppitunti 2/413 vaihetta

Factory Method -suunnittelumalli on ilmainen Java Academy-oppitunti CoddyKitissä. Tämä on oppitunti 2/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Java Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Java Academy-kurssilla on yhteensä 4 oppituntia.

Tehdasmetodin tarkoitus

Tehdasmetodi määrittelee rajapinnan olion luomista varten, mutta antaa aliluokkien päättää, mikä luokka luodaan. Se irrottaa luomislogiikan asiakaskoodista.

Ongelma ilman tehdasmetodia

Ilman tehdasta asiakaskoodi on täynnä new ConcreteClass()-kutsuja. Uuden muunnelman lisääminen tarkoittaa jokaisen kutsukohdan muuttamista — tämä rikkoo Open/Closed-periaatetta.

// Client knows too much:
Shape shape;
if (type.equals("circle")) shape = new Circle(r);
else if (type.equals("rect")) shape = new Rectangle(w, h);
// Every new shape requires editing this code.

Abstrakti luojaluokka

Määritelkää abstrakti luojaluokka, jolla on createProduct()-tehdasmetodi. Aliluokat korvaavat sen palauttaakseen tiettyjä tuotetyyppejä.

public abstract class Dialog {
    public void render() {
        Button btn = createButton(); // factory method
        btn.onClick();
    }
    protected abstract Button createButton();
}

Konkreettiset luojat

Kukin aliluokka korvaa tehdasmetodin palauttaakseen sopivan tuotteen muuttamatta perustyökalun ympärillä olevaa algoritmia.

public class WindowsDialog extends Dialog {
    @Override
    protected Button createButton() { return new WindowsButton(); }
}
public class WebDialog extends Dialog {
    @Override
    protected Button createButton() { return new HtmlButton(); }
}

Tuotteen rajapinta

Kaikki konkreettiset tuotteet toteuttavat yhteisen rajapinnan, jotta luoja voi käsitellä niitä yleisellä tavalla.

public interface Button {
    void onClick();
    void render();
}
public class WindowsButton implements Button {
    public void onClick() { System.out.println("Windows click"); }
    public void render() { System.out.println("Render Windows button"); }
}

Staattiset tehdasmetodit ja tehdasmetodimalli

Staattinen tehdasmetodi (esimerkiksi LocalDate.of()) on nimeämiskäytäntö, ei GoF:n tarkoittama malli. GoF:n malli käyttää perintää, kun taas staattiset tehtaat käyttävät staattisia metodeja yhdessä luokassa.

// Static factory (NOT the GoF pattern)
LocalDate d = LocalDate.of(2024, 6, 15);
// GoF Factory Method uses a class hierarchy

Parametrillinen tehdasmetodi

Välittäkää tehdasmetodille parametri, jolla valitaan useiden tuotteiden joukosta ilman, että kutakin tuotetta varten tarvitaan oma aliluokka.

public class ShapeFactory {
    public static Shape create(String type, double... dims) {
        return switch (type) {
            case "circle"    -> new Circle(dims[0]);
            case "rectangle" -> new Rectangle(dims[0], dims[1]);
            default -> throw new IllegalArgumentException("Unknown: " + type);
        };
    }
}

Tehdasmetodi geneeristen tyyppien kanssa

Käyttäkää geneerisiä tyyppejä, jotta tehdasmetodi on tyyppiturvallinen ja uudelleenkäytettävä eri tuoteperheissä.

public abstract class Repository<T, ID> {
    public abstract T findById(ID id);
    protected abstract T createEmpty(); // factory method
}

Tehtaiden rekisteröinti Map-rakenteeseen

Rekisteripohjainen tehdas tallentaa tyyppimerkkijonojen ja Supplier-lambda-lausekkeiden välisen Map-rakenteen. Näin vältetään if-else-ketjut ja rekisteröinti voidaan tehdä dynaamisesti.

Map<String, Supplier<Notification>> registry = new HashMap<>();
registry.put("email", EmailNotification::new);
registry.put("sms",   SmsNotification::new);
Notification n = registry.getOrDefault(type, DefaultNotification::new).get();

Tehdasmetodi ja abstrakti tehdas

Tehdasmetodi luo yhden tuotetyypin perinnän avulla. Abstrakti tehdas luo toisiinsa liittyvien tuotteiden perheitä koostamisen avulla. Käyttäkää tehdasmetodia, kun yksi tuote vaihtelee, ja abstraktia tehdasta, kun koko tuotevalikoima vaihtelee yhdessä.

Esimerkki käytännöstä: loggeritehdas

SLF4J:n LoggerFactory.getLogger(Class) on staattinen tehdas, joka palauttaa oikean logger-toteutuksen (Logback, Log4j tai JUL) ilman, että kutsuvan koodin tarvitsee tietää, mikä toteutus on kyseessä.

Logger log = LoggerFactory.getLogger(MyService.class);
log.info("Service started");

Pikatarkistus

Mikä on tehdasmetodimallin keskeinen ominaisuus?

Kertaus

Tehdasmetodi irrottaa olioiden luomisen asiakaskoodista sijoittamalla luotavan olion valinnan korvattaviin aliluokkien metodeihin. Käyttäkää sitä, kun luokka ei voi ennakolta tietää, millaisia olioita sen täytyy luoda.

Aloita maksutta

Opi Java tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
104
Oppitunnit
374

Usein kysytyt kysymykset

Onko oppitunti ”Factory Method -suunnittelumalli” ilmainen?

Kyllä – oppitunnin ”Factory Method -suunnittelumalli” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Java Academy-kurssin, päivitä CoddyKit PROhon. Java Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Factory Method -suunnittelumalli”?

Määritä factory-metodi kantaluokassa ja anna aliluokkien päättää, mikä tuote luodaan. Harjoittelet Java Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Java Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Java Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 2/4.

Kuinka kauan ”Factory Method -suunnittelumalli”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Java Academy-oppitunnilla?

Kyllä. Jokainen Java Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Singleton: säieturvalliset toteutukset
  2. Factory Method -suunnittelumalli
  3. Abstract Factory tuoteperheille
  4. Builder-malli fluent-rajapinnalla
← Takaisin: Java Academy