Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Po jednej instancji obiektów klas
Martio
post 11.10.2006, 09:57:58
Post #1





Grupa: Zablokowani
Postów: 167
Pomógł: 2
Dołączył: 15.02.2004

Ostrzeżenie: (30%)
XX---


Doczytałem się o wielu zaletach używania wzorca Singleton. Jednak nigdzie o jego wadach. Czy jest on tak doskonały, że nie posiada wad? Jeżeli jednak takowe posiada, to jakie?

Jak rozwiązanie jest bardziej optymalne i wydajne chcąc uruchomić tylko jedną jedyną instancję każdej klasy? Czy użycie wzroca Singleton czy Register (rejestr, do którego są rejestrowane wszystkie obiekty)? A może macie inne, lepsze rozwiązania na tworzenie po jednej instancji obiektu klasy?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 8)
sf
post 11.10.2006, 09:11:48
Post #2





Grupa: Zarejestrowani
Postów: 1 597
Pomógł: 30
Dołączył: 19.02.2003
Skąd: Tychy

Ostrzeżenie: (0%)
-----


Na początku w aplikacji posiadałem kilka singletonów ( praktycznie wszędzie ), ale z czasem doszedłem do wniosku, że singletony są do pupy i można sobie doskonale radzić bez nich.

Tak naprawdę pytanie jest czy naprawdę potrzebujesz zabezpieczyć daną klasę by powstał tylko jeden obiekt i ani jeden więcej? Czy nie lepiej po prostu przekazywać dany obiekt ( np. request, response , currentUser ... ) do poszczególnych części aplikacji, które z tego korzystają ( w phiend2 patrz context ). Ktoś sobie może stworzyć drugi obiekt request w środku akcji, ale czy to mu coś da? Po prostu to nic mu nie da i tyle ;-)

Aktualnie singleton wykorzystuje tylko w przypadku połączenia z bazą danych.

Przy okazji, jeśli w środku akcji stosujesz np. $oRequest = Request::getInstance() ... a po pewnym czasie stworzysz sobie inną klasę Request2 ... to teraz sobie wyobraź, że wszędzie, we wszystkich akcjach będziesz musiał zmieniać nazwę... porażka :/ Dlatego lepiej mieć jedno miejsce gdzie się tworzy obiekt na bazie jakieś klasy i w pozostałych miejscach się z niego korzysta.


--------------------
Zapraszam na mój php blog, tworzenie stron.
Go to the top of the page
+Quote Post
Turgon
post 11.10.2006, 13:34:54
Post #3





Grupa: Zarejestrowani
Postów: 800
Pomógł: 0
Dołączył: 26.11.2005
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


sf: Rozwiązanie proste. Coś ala fabryka połączona z rejestrem.


--------------------
Jah Music Is On My Mind !
Go to the top of the page
+Quote Post
bim2
post 11.10.2006, 14:40:49
Post #4





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


no własnie mozna tez zrobic (jesli ktos korzysta z autoload np. Rapide) że w autoload() dasz $oPlugin->registerPlugin($oKlasa); a pozniej odowlujesz sie gdzies do pluginu smile.gif Ja tak mam


--------------------
Go to the top of the page
+Quote Post
Martio
post 11.10.2006, 17:28:16
Post #5





Grupa: Zablokowani
Postów: 167
Pomógł: 2
Dołączył: 15.02.2004

Ostrzeżenie: (30%)
XX---


Mam klasę od serwowania tekstów we właściwej wersji językowej. W jej konstruktorze odbywa się parsowanie XML, a więc zależy mi na tym, aby była tylko jedna instancja tej klasy. Macie jakieś pomysły na to?
Go to the top of the page
+Quote Post
Turgon
post 11.10.2006, 19:37:58
Post #6





Grupa: Zarejestrowani
Postów: 800
Pomógł: 0
Dołączył: 26.11.2005
Skąd: Nowy Sącz

Ostrzeżenie: (0%)
-----


Jak mówiłem wcześniej autoload plus rejestr. Więc jak skończę mojego dev-bloga napiszę notę na ten temat.


--------------------
Jah Music Is On My Mind !
Go to the top of the page
+Quote Post
Prph
post 11.10.2006, 19:52:50
Post #7





Grupa: Zarejestrowani
Postów: 338
Pomógł: 2
Dołączył: 4.03.2006
Skąd: Łódź

Ostrzeżenie: (0%)
-----


Cytat(Martio @ 11.10.2006, 16:28:16 ) *
Mam klasę od serwowania tekstów we właściwej wersji językowej. W jej konstruktorze odbywa się parsowanie XML, a więc zależy mi na tym, aby była tylko jedna instancja tej klasy. Macie jakieś pomysły na to?


Ja uzylbym Singleton, chociaz Twoj opis nie jest wyczerpujacy winksmiley.jpg
W swoim frameworku uzywalm tylko 2 singletonow - Controller_Front i Language. Powod: nie chce przekazywac wszedzie frontkontrolera. Niech jest singletonem i bedzie dostepny globalnie. Co do Language - nie umialem inaczej tego rozwiazac. Singleton wydaje sie dobrym rozwiazaniem.

Adrian.
Go to the top of the page
+Quote Post
bim2
post 11.10.2006, 21:17:06
Post #8





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 152
Dołączył: 9.04.2006
Skąd: Berlin

Ostrzeżenie: (0%)
-----


Wzoruje się na rapidzie ale language walnołem w pluginy tongue.gif a w controllerze mam getPlugin('jakis_plugin') który odwołuje się do obiektu language i metody getPlugin() biggrin.gif


--------------------
Go to the top of the page
+Quote Post
UDAT
post 13.10.2006, 13:50:29
Post #9





Grupa: Zarejestrowani
Postów: 442
Pomógł: 0
Dołączył: 27.12.2005

Ostrzeżenie: (0%)
-----


Cytat(Martio @ 11.10.2006, 10:57:58 ) *
A może macie inne, lepsze rozwiązania na tworzenie po jednej instancji obiektu klasy?


Wykorzystanie aspektów, np.: phpAspect - dział Examples albo kontener IOC

Ten post edytował UDAT 13.10.2006, 13:50:48
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 14:04