JHacks
[ start | index | login or register ]

Factory Method

Created by karenin. Last edited by zmb, one year and 101 days ago. Viewed 250 times. #3
[diff] [history] [edit] [rdf]
labels
attachments
A lényeg az, hogy ne interface-re gondoljunk, hanem abstract osztályra.

Mondjuk van egy Jármű absztrakt osztályunk, aminek van createKerék() és cserélKerék() függvénye. Az előbbi absztrakt, hiszen a Szekérben más fajta kereket kreálunk, mint mondjuka Kocsi-ban. Viszont a cserélKerék egész konkrét, neki mindegy, hogy melyik kerék van, azt null-ra állítja, és aztán kicseréli azzal, hogy meghívja a createKerék() metódust, ami egy gyerek osztályban lesz implementálva. Tehát a factory method egy konkrét gyerek osztályban van implementálva, de már az absztrakt ős használja a gyümölcsét (nyilván itt is interface-en keresztül).

Na, ez nem biztos, hogy érthető lett, pedig valami ilyesmiről van szól.

Persze, ha már itt vagyunk, mondhatjuk azt is, hogy a Jármű nem is absztrakt, hanem ő is interface, de van valaki más, akin majd hivogatni akarja a jármű->createKerék()-et. Pl. az Abstract Factory egy szakajtó ilyen Factory Methodról szól.

Minimalista példa az érthetőség kedvéért.

//a termek, amit a factory method eloallit
public interface Kerek {
}

//a termek ket megvalositasa public class AutoKerek implements Kerek {

public String toString() { return "autokerek"; } }

public class SzekerKerek implements Kerek {

public String toString() { return "szekerkerek"; } }

//az os jarmu osztaly, ami hasznalja a factory methodot abstract public class Jarmu { protected Kerek kerek;

public abstract Kerek createKerek();

public void cserelKerek() { kerek = createKerek(); }

}

//ket konkret megvalositasa public class Szeker extends Jarmu {

public Kerek createKerek() { return new SzekerKerek(); }

public String toString() { return "Szeker, "+kerek; }

}

public class Auto extends Jarmu {

public Kerek createKerek() { return new AutoKerek(); }

public String toString() { return "Auto, "+kerek; } }

//vegul a tesztapp public class Main {

public static void main(String[] args) { Jarmu j1 = new Auto(); Jarmu j2 = new Szeker(); j1.cserelKerek(); j2.cserelKerek(); System.out.println(j1); System.out.println(j2); } }

//es a kimenet Auto, autokerek Szeker, szekerkerek

no comments | post comment
snipsnap.org | Copyright 2000-2002 Matthias L. Jugel and Stephan J. Schmidt