2012-12-31 10 views
9

Pomimo wielu wątków na ten temat, wciąż nie jestem pewien, kiedy wybrać, które podejście. Mam nadzieję, że omawiając konkretny przykład, w końcu go "zdobędę".Klasa Singleton kontra klasa z elementem statycznym

Uwaga: moim językiem jest tutaj kakao, chociaż ogólny problem nie dotyczy konkretnego języka.

Mam klasy TaskQueue że chcę użyć do:

  • dostępu z dowolnego miejsca w kodzie, aby dodać lub usunąć zaplanowane zadania
  • procesowe automatycznie zaplanowane zadania w regularnych odstępach

Kiedy po raz pierwszy użyto TaskQueue, chcę, aby TaskQueue zainicjował wątek, który następnie będzie budził się w regularnych odstępach czasu w celu przetworzenia zadań.

Oczywiście będą potrzebne przy co najmniej dwóch czynników:

  • tablicę do przechowywania zadania
  • wystąpienie gwintu przetwarzania zadań

Ponieważ jest tylko jedna kolejka zadań i jeden wątek do przetwarzania tych zadań, mam dwie możliwości:

  1. Dokonaj TaskQueue singleton klasy (używając na przykład CWL_DECLARE_SINGLETON_FOR_CLASS_WITH_ACCESSOR jak opisano w http://www.cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html, który moim zdaniem będzie trzeba zmodyfikować plik CWLSynthesizeSingleton.h aby rozpocząć wątek w Init czasie).

  2. Mają szereg zadań i nici instancja być zarówno statyczne (zgodnie z podejściem zasugerował tutaj: How do I declare class-level properties in Objective-C?)

Czy jest niewątpliwie jednym podejściem, które lepiej niż inne w tym konkretnym przypadku? Jeśli tak, dlaczego?

+0

oszuka: http://stackoverflow.com/questions/519520/difference-between-static-class-and-singleton-pattern?lq=1 – cregox

Odpowiedz

29

Główne różnice są proste rzeczy jak:

  • z Singleton można przechodzić wokół obiektu dla delegatów i Callbacki
  • z Singleton można implementować interfejsy i czerpać ją
  • z Singleton możesz użyć wzorca fabrycznego do zbudowania instancji

Jeśli nie potrzebujesz żadnego z nich, tak jak w przypadku funkcji globalnej, do której musisz uzyskać dostęp w całym Yo Kod ur można następnie za pomocą metod statycznych.

Ja osobiście wolę używać metod statycznych, chyba że mam wyraźny powód, aby użyć instancji singleton (takich jak posiadanie wspólnego interfejsu, ale różne implementacje).

Pamiętaj, że refaktoryzacja metod statycznych na instancję singleton jest dość prostym procesem, więc jeśli kiedykolwiek będziesz potrzebować tego ostatniego, to łatwo go refactor (wtedy masz preprocesor C, pojedynczy #define będzie prawie wystarczający).

+0

Jasne i zwięzłe. Dzięki. – Lolo

+2

Jedno pytanie: czy można podać przykład scenariusza, w którym przekazywanie obiektu do delegatów i wywołań zwrotnych byłoby użyteczne/wymagane, a nie po prostu używanie metod statycznych i nieprzekazywanie żadnego obiektu? – Lolo

+2

Każdy standardowy element delegujący kakao, który ustawiono za pomocą 'object.delegate = instance', wymaga rzeczywistego wystąpienia obiektu. Klasa z metodami statycznymi nie mogła być użyta w takim scenariuszu do pełnienia roli delegata. Jeśli mechanizm wywołania zwrotnego/delegowania jest zaimplementowany przez ciebie, zawsze możesz uniknąć potrzeby rzeczywistych instancji. – Jack