![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zablokowani Postów: 167 Pomógł: 2 Dołączył: 15.02.2004 Ostrzeżenie: (30%) ![]() ![]() |
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? |
|
|
![]() |
![]()
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.
|
|
|
![]()
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 !
|
|
|
![]()
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
![]() -------------------- |
|
|
![]()
Post
#5
|
|
Grupa: Zablokowani Postów: 167 Pomógł: 2 Dołączył: 15.02.2004 Ostrzeżenie: (30%) ![]() ![]() |
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?
|
|
|
![]()
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 !
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Zarejestrowani Postów: 338 Pomógł: 2 Dołączył: 4.03.2006 Skąd: Łódź Ostrzeżenie: (0%) ![]() ![]() |
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 ![]() 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. |
|
|
![]()
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
![]() ![]() -------------------- |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 442 Pomógł: 0 Dołączył: 27.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
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 |
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 14.08.2025 - 14:04 |