Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Wzorzec fabryki
Orzeszekk
post
Post #1





Grupa: Zarejestrowani
Postów: 260
Pomógł: 14
Dołączył: 8.09.2011

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


Pytanie do mądrzejszych ode mnie forumowiczów.

Mam klase np. abstractMessage która jest szkieletem zapisujacym message do bazy danych.

następne z klasy abstractMessage tworze klasy pochodne np SMSMessage, EmailMessage.
Rodzaj wiadomosci przechowuje w polu $type obiektu abstractMessage, dzieki czemu wiadomo czy to SMSMessage, i EmailMessage.

Potrzebuje wzorca fabryki (metody wytwórczej?), tylko poprawnego. Teraz bym to zrobił tak:

  1. class abstractMessage{
  2. public static function load($databaseRow)
  3. {
  4. [....]
  5. switch ($databaseRow->type)
  6. {
  7. case TYPE_SMS_MESSAGE: return new SmsMessage($databaseRow); break;
  8. case TYPE_EMAIL_MESSAGE: return new EmailMessage($databaseRow); break;
  9. }
  10. }
  11. }

jednak takie rozwiązanie jest podobno do kitu ponieważ w przypadku jeżeli powstaną nowe typy dziedziczące po abstractMessage to będe musiał zmodyfikować ten switch tworzący obiekty, a w ten sposob zlamie zasade otwarte-zamknięte - zamiast rozszerzać klasę dodajac metody modyfikuję istniejący kod w celu rozszerzenia funkcjonalności.

No a jeżeli nie utworze odpowiedniego typu (SMSMessage, EmailMessage) to nie będę mógł użyć ich specyficznych metod.

Więc jak to poprawnie rozwiązać? Chcę rozwiązania na maksa poprawnego z dobrymi praktykami programistycznymi, bo już dostałem niedawno durszlakiem pełnym kodu spagetti mocno w głowę i chcę tego uniknąć (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Sephirus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 527
Pomógł: 438
Dołączył: 28.06.2011
Skąd: Warszawa

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


Nie do końca Cię rozumiem ale mogę podpowiedzieć:

Pamiętaj że zapis:

  1. new SmsMessage($databaseRow);


Jest równoważny z:

  1. $className = 'SmsMessage';
  2.  
  3. new $className($databaseRow);


(IMG:style_emoticons/default/wink.gif)

I cytat z jakiegoś kodu dotyczącego fabryki:

  1. <?php
  2. public function make( $className )
  3. {
  4. return new $className();
  5. }
  6. ?>


(IMG:style_emoticons/default/tongue.gif)

Ten post edytował Sephirus 16.11.2011, 14:22:51
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 9.10.2025 - 02:10