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


Odpovedet emailem