2009-09-15 15 views
7

Zastanawiam się, czy istnieje przeciwny wzorzec fabrycznego wzoru. Na przykład, gdy pewien obiekt musi zostać usunięty, należy wykonać dodatkową pracę, aby cofnąć konfigurację, która została wykonana w obiekcie fabrycznym.Który wzór jest przeciwieństwem wzoru Factory?

Wydłużanie obiektu fabrycznego za pomocą metody Delete wydaje się błędne, ponieważ wzorzec fabryczny to ściśle kreacyjny wzór.

Aktualizacja: Powodem, dla którego używam fabryki jest to, że konfiguracja, która musi zostać wykonana, wprowadziłaby pewne zależności do obiektu, który nie pasowałby. Umieszczenie tej de-konfiguracji w konstruktorze stwarza ten sam problem.

+2

Co dokładnie masz na myśli, mówiąc o "usuwaniu"? Zwolnienie z pamięci lub usunięcie z magazynu danych? –

+0

Usunięcie oznaczało usunięcie go z magazynu danych, to byłoby zrobione przez repozytorium. –

+0

i jaka "konfiguracja została wykonana w obiekcie fabryki"? Obiekt powinien być zdolny do oczyszczania po sobie, z zadaniem destruktorów i/lub dysponowania. Twierdzę, że fabryka nie powinna niczego wiedzieć o przedmiotach, które stworzyła. –

Odpowiedz

3

To dobry sposób na wykorzystanie fabryki. Fabryka to nie tylko sposób na tworzenie obiektów, ale także sposób na powiedzenie: Potrzebuję specjalnej inicjalizacji dla tego rodzaju obiektów. Z twoim problemem myślę, że najlepszym rozwiązaniem byłoby powiadomić fabrykę o jakimś wydarzeniu, np. Unieszkodliwionym. Zatem twoja kreacja obiektu zostanie wykonana w taki sposób: stwórz, zasubskrybuj fabrykę do zdarzenia nowo utworzonego obiektu. Za każdym razem, gdy obiekt zostanie usunięty, powiadomi o tym fabrykę i podejmie działania, których potrzebujesz.

Jeśli nie chcesz umieścić go w fabryce, możesz przekazać go do innego obiektu, takiego jak DeathKeeper ;-). Więc Twój kod będzie wyglądać sometihng tak:

//Inside factory create method 
MyObject obj = GetNewInitializedObject(); 
_detahKeeper.RegisterObject(obj); 

return obj; 

Teraz za każdym razem trzeba będzie usunąć obiekt, Twój obiekt powiadomi śmierci bramkarza i byłoby zrobić wszystko wrzucać logiki. Nawiasem mówiąc, nie wiem, jak to wszystko działa, ale można użyć interfejsu IDisposable do zrobienia niestandardowej logiki do wyrzucania zasobów przechowywanych przez obiekt. Decyzja zależy od tego, co jest w twoim projekcie i zależy od ciebie.

4

Do usunięcia uporczywego obiektu można użyć repozytorium lub użyć metody dispose do wykonania czyszczenia na obiekcie tylko w pamięci.

+0

Porzucę tę "de-konfigurację" w repozytorium na teraz. –

+0

Czy chcesz zniszczyć wszelkie utrwalone informacje (baza danych/plik)? –

2

używać „recykling facility” wzór współpracujących z fabryką:

  • mieć „czysty” sposób dla każdej grupy, które mogą być przerobione
  • mają „unikalny identyfikator” dla każdego obiektu instancja

każdym razem, gdy obiekt osiągnie koniec okresu eksploatacji, wysłać go do instrumentu "Recycling" (RF):

  • RF zapisuje obiekt zgodnie z pewną polityką (np. zachować tylko instancje X klasy Y)
  • Gdy wymagana jest instancją klasy Y, fabryka „pyta” RF jeśli jego dostał jeden
    • jeśli RF ma jedno poręczne, RF nazywa „czysty()”metoda na wystąpienie i zwraca go do Fabryki

... i tak dalej, tak dalej.

Mam nadzieję, że to pomoże.

Powiązane problemy