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