Nadesłany przez Kamil Dworak, 20 sierpnia 2010 22:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
JAVA.java:
/**************************************** * Wzorzec Projektowy Factody Method * * (metoda fabrykujaca) * * www.algorytm.org * * Opracowal Dworak Kamil * *****************************************/ /* nasz uogolniony produkt */ abstract class Czekolada { protected String about; public abstract Czekolada dawajCzekolade(); protected void dodajeKakao(){ System.out.println("Dodaje kakao..."); } } /* bardziej konkretny produkt #1*/ class Mleczna extends Czekolada { public Mleczna(){ about = "Mleczna"; } public void dodajeMleko(){ System.out.println("Dodaje mleko..."); } public void dodajeCukier(){ System.out.println("Dodaje cukier..."); } public Czekolada dawajCzekolade(){ System.out.println(about); dodajeKakao(); dodajeCukier(); dodajeMleko(); return this; } } /* bardziej konkretny produkt #2*/ class ZOrzechamiIBakaliami extends Czekolada{ public ZOrzechamiIBakaliami(){ about = "Z orzechami i bakaliami"; } public void dodajeOrzechy(){ System.out.println("Dodaje orzechy..."); } public void dodajeBakalie(){ System.out.println("Dodaje bakalie..."); } public void dodajeCukier(){ System.out.println("Dodaje cukier..."); } public Czekolada dawajCzekolade(){ System.out.println(about); dodajeKakao(); dodajeCukier(); dodajeOrzechy(); dodajeBakalie(); return this; } } /* bardziej konkretny produkt #3*/ class Gorzka extends Czekolada { public Gorzka(){ about = "Gorzka"; } public void dodajeEkstratWaniliowy(){ System.out.println("Dodaje ekstrat waniliowy..."); } public Czekolada dawajCzekolade(){ System.out.println(about); dodajeKakao(); dodajeEkstratWaniliowy(); return this; } } /* nasz stworca */ class ProducentCzekolady{ public Czekolada produkcjaCzekolady(String about){ Czekolada czekolada = null; /* teraz decyduje o tym, ktora czekolade wytworzy */ if(about.equalsIgnoreCase("Mleczna")){ czekolada = new Mleczna(); } else if(about.equalsIgnoreCase("Z orzechami i bakaliami")){ czekolada = new ZOrzechamiIBakaliami(); } else if(about.equalsIgnoreCase("Gorzka")){ czekolada = new Gorzka(); } return czekolada.dawajCzekolade(); } } public class Main { public static void main(String[]args){ ProducentCzekolady producent = new ProducentCzekolady(); Czekolada[] tab = new Czekolada[3]; tab[0] = producent.produkcjaCzekolady("Gorzka"); System.out.println("--------------------------------------------------------------"); tab[1] = producent.produkcjaCzekolady("Z orzechami i bakaliami"); System.out.println("--------------------------------------------------------------"); tab[2] = producent.produkcjaCzekolady("Mleczna"); } }
Metoda wytwórcza wymaga abstrakcyjnej klasy fabryki i różnych jej implementacji w klasach pochodnych.
Jakby było:
class Producent {
public abstract Czekolada produkcjaCzekol ady(String about)
}
a potem:
class ProducentCzekol ady extends Producent {
...
to dopiero by była fabryka wytwórcza