Ocena użytkownikóww: ***** / 9
Nadesłany przez Kamil Dworak, 01 września 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.
Singleton.java:
/****************************************
* Wzorzec Projektowy Singleton *
* www.algorytm.org *
* Opracowal Dworak Kamil *
*****************************************/
class MenedzerPlikow {
private static MenedzerPlikow instancja = null;
private int identyfikator;
private MenedzerPlikow(){
identyfikator = (int)((Math.random()*10)%10);
}
//-------------------------------------------------------------------------------------------#1 sposob
public static synchronized MenedzerPlikow dawajMenedzer(){
if(instancja == null){
instancja = new MenedzerPlikow();
return instancja;
}
System.out.println("Menedzer juz zostal wczesniej utworzony!");
return instancja;
}
public void about(){
System.out.println("Identyfiaktor = " + identyfikator);
}
/*-------------------------------------------------------------------------------------------#2 sposob
// nie inicjujemy tutan nullem, instancja juz od poczatku posiada wartosc
private final static MenedzerPlikow instancja = new MenedzerPlikow();
public static MenedzerPlikow dawajMenedzer(){
return instancja;
}
*/
/*------------------------------------------------------------#3 sposob - metoda podwojnego blokowania
private static volatile MenedzerPlikow instancja=null;
public static MenedzerPlikow dawajMenedzer(){
if(instancja == null){
synchronized (MenedzerPlikow.class){
instancja = new MenedzerPlikow();
}
}
return instancja;
}
*/
}
public class Singleton {
public static void main(String[]args){
MenedzerPlikow[] tab = new MenedzerPlikow[3];
tab[0] = MenedzerPlikow.dawajMenedzer();
tab[1] = MenedzerPlikow.dawajMenedzer();
tab[2] = MenedzerPlikow.dawajMenedzer();
for(MenedzerPlikow object : tab)
object.about();
}
}
W wersji 1? - tam "return instancja;" powoduje, że i tak linijka System.out nie zaistnieje
singleton lepiej implementować instancję w obrębie enuma, a nie klasy. Enum zapewni ci, że nie będzie można utworzyć więcej niż jedną instancję obiektu, w przypadku klasy i mechanizmu refleksji istnieje możliwość zmiany modyfikatora dla instancji na public i nadpisywania instancji