Jeste k tem patternum,
Patterny nejsou striktne vazany na javu, jedna se spis
o jakesi standardni konstrukce pouzivane v objektove
orientovanem programovani, stejne dobre pujdou pouzit
i v C++, C# nebo Pythonu. Je to prostredek jak snaze
napsat dobry kod (casto podobne problemy uz nekdo
vyresil lepe, nez kdy budu schopen ja) i k usnadneni
komunikace (je snazsi a pochopitelnejsi rict kolegovi
"udelej z toho singleton" nez "tuhle tridu napis tak,
aby existovala jedina instance a jeji vytvorei bylo v
rezii tridy same". Pro studium patternu bych Vam doporucil
zejmena knihu "Head First Design Patterns", o niz se
tu nedavno diskutovalo, ale je jich vic, napriklad
predmailnikem zminene internetove odkazy.
Co se tovarni metody tyce, je to aternativa k verejnemu
konstruktoru, ktera je nekdy (ne vzdy) vhodnejsi. Jeji
vyhodou je zejmena lepsi kontrola nad vytvarenim objektu.
Jedna se o to, ze trida poskytne public static metodu, ktera vraci
tuto tridu (nebo ji implementovany interface) a skryje (protected
nebo private) konstruktor. Tedy misto
class MyClass() {
public MyClass() {
...
}
}
udelam
class MyClass() {
private MyClass() {
...
}
public static MyClass getInstance() {
MyClass myClass = new MyClass();
...
return myClass;
}
}
Jake to ma vyhody?
- nemusim vzdy vracet novy objekt: u tridy Boolean nestojim o to,
abych mel 1000 ruznych instanci hodnoty TRUE, takze neposkytnu
konstruktor public Boolean(String str), ale poskytnu tovarni metodu
public Boolean getValue(String str) a vratim jednu z jiz hotovych
hodnot Boolean.TRUE nebo Boolean.FALSE
- mohu si provest pre-inicializaci, jak se mi zlibi; v ramci tovarni
metody mohu novy objekt vytvorit az tehdy, kdy se mi to hodi:
class MyClass {
// skryty konstruktor
private MyClass(Param p) {
...
}
// verejna tovarni metoda
public static MyClass getInstance(Param p) {
preinicializace(p);
MyClass retVal = new MyClass(p);
postinicializace(p);
return retVal;
}
...
}
- konstruktor se dle syntaxe jmenuje stejne jako trida a tudiz
jeho jmeno nemuze nest informaci o jeho funkci, coz nekdy muze
byt na skodu; tovarni metoda muze informovat uz svym jmenem
o sve funkci: napr. BigInteger nabizi konstruktory
BigInteger(int bitLength, int certainty, Random rnd)
a BigInteger(int numBits, Random rnd) ktere vytvori BigInteger,
ktery je pravdepodobne prvocislo, prip. nahodne cislo.
Tovarni metody createProbablePrime a createRandom by byly
vhodnejsi - v kodu by bylo jasnejsi, co delaji; srovnejte:
...
BigInteger pPrime = new BigInteger(55, 10, new Random());
...
a
...
BigInteger pPrime = BigInteger.createProbablePrime(55, 10, new Random());
...
- tovarni metoda muze vratit i instanci podtridy,
pokud pro to je duvod; konstruktor vzdy vraci jen
instanci te tridy, ve ktere je napsan:
class URL {
public URL(String str) {
...
}
}
vzdy vrati jen objekt typu URL.
class URL {
public static URL getURL(String str) {
if (zacina(str, "file:")) {
return new FileURL(str);
} else if (zacina(str, "http:")) {
return new WebURL(str);
} ...
}
}
muze vratit instanci ruznych podtrid tridy URL.
Samozrejme to muze mit i nevyhody, napriklad se
tim komplikuje az znemoznuje dedicnost. Kazdopadne
jeste jednou doporucim knihu J.Blocha "Java Efektivne",
viz tez http://www.linuxzone.cz/index.phtml?ids=33&idc=475
kde zrovna factory method je take rozebirana.
Dobrou noc
VN
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On
Behalf Of Goo GGooo
Sent: Monday, November 21, 2005 11:51 PM
To: Java
Subject: Re: Konstruktory
Diky vsem za vysvetleni!
Ted si jenom nekde nastudovat co je to "tovarni metoda" ;-) Jak se
tomu rika anglicky? Mam k ruce jen knizku "Java in a nutshell", kde
jsem zadnou zminku o "factory method" nenasel.
Goo