Wzorzec projektowy Factory

Factory – ang. fabryka.

Zadanie programistyczne

Smoki produkują zabawki – smoki Draco dla dzieci.
Zabawki różnią się nazwą (płcią), kolorem i łuską.
Cykl produkcyjny obejmuje 4 czynności: przygotowanie, malowanie, dodawanie łusek, pakowanie.
Każda zabawka może mieć inne cechy wykończeniowe podawane przez zamawiającego.
Opracować schemat zamawiania i produkcji zabawek.

Rozwiązanie

Utworzyć abstrakcyjna klasę ZabawkaDraco (pola są z dostępem pakietowym).
Utworzyć klasy implementujące: SmokDraco, SmoczycaDraco, SmoczynkaDraco, SmoczekDraco.
Utworzy fabrykę FabrykaSmokow produkującą odpowiednią zabawkę.
Utworzyć hurtownię HurtowniaSmokow sprzedającą zabawki z tej fabryki.

Kody

Klasa ZabawkaDraco
package simplefactory;
import java.util.*;
abstract public class ZabawkaDraco {
    String nazwa;
    String kolor;
    String luska;
    final ArrayList<String> gotowce = new ArrayList<>();
    public String getName() {
        return nazwa;
    }
    public void przygotuj() {
        System.out.println("Przygotowuję " + nazwa);
    }
    public void pomaluj() {
        System.out.println("Maluję " + nazwa);
    }
    public void dodajLuske() {
        System.out.println("Dodaję łuskę dla " + nazwa);
    }
    public void zapakuj() {
        System.out.println("Pakuję " + nazwa);
    }
    @Override
    public String toString() {
        StringBuilder display = new StringBuilder();
        display.append("---- ").append(nazwa).append(" ----\n");
        display.append(kolor).append("\n");
        display.append(luska).append("\n");
        for (String aGotowce : gotowce) {
            display.append(aGotowce).append("\n");
        }
        return display.toString();
    }
}
Klasa SmokDraco
package simplefactory;
class SmokDraco extends ZabawkaDraco {
    public SmokDraco() {
        nazwa = "Tata Smok";
        kolor = "złoty";
        luska = "kafelkowana";
        gotowce.add("grzebień na grzbiecie");
        gotowce.add("oczy czerwone");
        gotowce.add("pazury niebieskie");
    }
}
Klasa SmoczycaDraco
package simplefactory;
class SmoczycaDraco extends ZabawkaDraco {
    public SmoczycaDraco() {
        nazwa = "Mama Smok";
        kolor = "zielony";
        luska = "gładka";
        gotowce.add("bez grzebienia");
        gotowce.add("oczy zielone");
    }
}
Klasa SmoczynkaDraco
package simplefactory;
class SmoczynkaDraco extends ZabawkaDraco {
    public SmoczynkaDraco() {
        nazwa = "Smoczynka";
        kolor = "różowy";
        luska = "poprzecznie prążkowana";
        gotowce.add("kokardka");
    }
}
Klasa SmoczekDraco
package simplefactory;
class SmoczekDraco extends ZabawkaDraco {
    public SmoczekDraco() {
        nazwa = "Smoczek";
        kolor = "niebieski";
        luska = "karbowana";
        gotowce.add("bez grzebienia");
        gotowce.add("szczątkowe skrzydła");
    }
}
Klasa FabrykaSmoków
package simplefactory;
class FabrykaSmokow {
    public ZabawkaDraco wyprodukujDraco(String type) {
        ZabawkaDraco smok = null;
        switch (type) {
            case "smoczyca":
                smok = new SmoczycaDraco();
                break;
            case "smoczek":
                smok = new SmoczekDraco();
                break;
            case "smoczynka":
                smok = new SmoczynkaDraco();
                break;
            case "smok":
                smok = new SmokDraco();
                break;
        }
        return smok;
    }
}
Klasa HurtowniaSmokow
package simplefactory;
class HurtowniaSmokow {
    private final FabrykaSmokow fabryka;
    public HurtowniaSmokow(FabrykaSmokow fabryka) {
        this.fabryka = fabryka;
    }
    public ZabawkaDraco zamowDraco(String type) {
        ZabawkaDraco smok;
        smok = fabryka.wyprodukujDraco(type);
        smok.przygotuj();
        smok.pomaluj();
        smok.dodajLuske();
        smok.zapakuj();
        return smok;
    }
}
Klasa Main
package simplefactory;
class Main {
    public static void main(String[] args) {
        FabrykaSmokow fabryka = new FabrykaSmokow();
        HurtowniaSmokow hurtownia = new HurtowniaSmokow(fabryka);
        ZabawkaDraco zabawka = hurtownia.zamowDraco("smoczyca");
        System.out.println(zabawka.toString());
    }
}

Rezultat

Przygotowuję Mama Smok
Maluję Mama Smok
Dodaję łuskę dla Mama Smok
Pakuję Mama Smok
---- Mama Smok ----
zielony
gładka
bez grzebienia
oczy zielone

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *