|
Flexibilitatea (cu costul simplitatii si performantei) e oferita de polimorfism: pot schimba singletonul la runtime pentru a ii schimba comportamentul. Un exemplu este pentru unit testing, cand nu vrei sa aiba efecte secundare apelurile catre singletoni din clasa / metoda pe care o testezi.
Prietenia cu clasa din care a derivat e o eroare de compilare pe care n-a prins-o pentru ca template-urile nu se compileaza decat atunci cand sunt folosite / apelate. Friendul ala trebuia pus in clasa parinte pentru a-i da copilului acces la constructorul privat; pus in clasa copil nu face nimic, pentru ca aceasta tot nu are acces la constructorul parintelui.
In orice caz, friend in parinte va trebui adaugat pentru fiecare clasa copil, ceea ce e ineficient. O solutie este transformarea constructorului din clasa parinte in protected.
class CMySingleton : public CSingleton<CMySingleton> e un fel de a-i spune compilatorului: "mestere, scrie-mi tu functiile astea te rog ca e o bataie de cap sa tot scriu acelasi cod peste tot si asigura-te ca nu poate sa instantieze clasa.". Iata un exemplu mai "curat" din Modern C++ Design, unde nu se mai forteaza clasa ca singleton prin mostenire.
[CODE]
template <
class T,
template <class> class CreationPolicy = CreateUsingNew,
template <class> class LifetimePolicy = DefaultLifetime,
template <class> class ThreadingModel = SingleThreaded
>
class SingletonHolder;
class MyClass { ... };
typedef Singleton<MyClass, CreateStatic> MySingleClass;
[/CODE]Overkill? Stiu ca atunci cand te chinui sa scoti ultimul strop de performanta n-ai chef de template-uri, mosteniri virtuale si alte lucruri, dar mie personal imi place sa ma indrept catre zone in care gasesti oportunitati pentru un design creativ si nu sunt foarte solicitante din punct de vedere al performantei. Cateodata n-am incotro si merg low-level, dar un design si flexibil si performant ma unge pe suflet.
P.S: Am observat ca ai criticat dur Large-scale C++ Software Design de Lakos pe "celalalt forum". Chiar mi-ai trezit curiozitatea in legatura cu ce ti-a placut la carte si ce nu.
Last edited by BT; 14-05-2007 at 00:22.
|