Czytałem różne opinie na temat wzoru singletonu. Niektórzy twierdzą, że należy tego unikać za wszelką cenę, a inni, że może być przydatny w niektórych sytuacjach.
Jedną z sytuacji, w której używam singletonów, jest sytuacja, w której potrzebuję fabryki (powiedzmy obiektu f typu F), aby utworzyć obiekty określonej klasy A. Fabryka jest tworzona raz przy użyciu niektórych parametrów konfiguracyjnych, a następnie jest używana za każdym razem tworzona jest instancja typu A. Tak więc każda część kodu, która chce utworzyć instancję A, pobiera singleton f i tworzy nową instancję, np
F& f = F::instance();
boost::shared_ptr<A> a = f.createA();
Więc mój ogólny scenariusz jest taki
- Potrzebuję tylko jednego wystąpienia klasy ze względów optymalizacyjnych (nie potrzebuję wielu obiektów fabryki) lub do wspólnego stanu (np. Fabryka wie, ile wystąpień klasy A może nadal utworzyć)
- Potrzebuję sposobu na dostęp do tego wystąpienia f z F w różnych miejscach kodu.
Nie interesuje mnie dyskusja, czy ten wzór jest dobry czy zły, ale zakładając, że chcę uniknąć używania singletonu, jakiego innego wzoru mogę użyć?
Pomysły, jakie miałem (1), aby uzyskać obiekt fabryki z rejestru lub (2), aby utworzyć fabrykę w pewnym momencie podczas uruchamiania programu, a następnie przekazać fabrykę jako parametr.
W rozwiązaniu (1) sam rejestr jest singletonem, więc właśnie przesunąłem problem nieużywania singletonu z fabryki do rejestru.
W przypadku (2) potrzebuję początkowego źródła (obiektu), z którego pochodzi obiekt fabryczny, dlatego obawiam się, że ponownie wrócę do innego singletonu (obiektu, który zapewnia moją instancję fabryki). Podążając za tym łańcuchem singletonów, mogę być może zredukować problem do jednego singletonu (całej aplikacji), za pomocą którego wszystkie inne singletony są zarządzane bezpośrednio lub pośrednio.
Czy ta ostatnia opcja (użycie jednego początkowego singletonu, który tworzy wszystkie inne unikalne obiekty i wstrzykuje wszystkie inne singletony we właściwe miejsca) byłaby akceptowalnym rozwiązaniem? Czy jest to rozwiązanie sugerowane domyślnie, gdy odradza się stosowanie singletonów, czy jakie są inne rozwiązania, np. W powyższym przykładzie?
EDYTOWAĆ
Ponieważ uważam, że punkt mojego pytania został przez niektórych źle zrozumiany, oto kilka dodatkowych informacji. Jak wyjaśniono np. Tutaj , słowo singleton może oznaczać (a) klasę z obiektem o pojedynczej instancji oraz (b) wzorzec projektowy użyty do utworzenia i uzyskania dostępu do takiego obiektu.
Aby to wyjaśnić, użyjmy terminu unikalny obiekt dla (a) i wzorca singletonu dla (b). Wiem więc, jaki jest wzorzec singletonu i wstrzykiwanie zależności (BTW, ostatnio intensywnie używam DI do usuwania instancji wzorca singletonu z kodu, nad którym pracuję).
Chodzi mi o to, że o ile nie zostanie utworzona instancja wykresu całego obiektu z jednego obiektu żyjącego na stosie głównej metody, zawsze będzie potrzeba dostępu do niektórych unikalnych obiektów poprzez wzorzec singletonu.
Moje pytanie brzmi, czy posiadanie pełnego tworzenia wykresów obiektowych i okablowania zależy od głównej metody (np. Za pomocą jakiegoś potężnego frameworka DI, który nie używa samego wzorca) jest jedynym rozwiązaniem wolnym od wzorca .