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