Wzorce projektowe (9)
Autor: Damian Chodorek • Opublikowany: 21 lipca 2015 • Ostatnia aktualizacja: 23 lipca 2015 • Kategoria: kursy, wzorce projektowe
Uogólniony Singleton – Singleton Holder.
SingletonHolder to szablon, który umożliwia użytkownikowi wybór:
CreationPolicy
– sposób tworzenia i usuwania instancji. Posiada metody statycznecreate()
orazdestroy()
.LifeTimePolicy
– sposób decydowania kiedy usunąć egzemplarz singletona. Posiada dwie metody:ScheduleDestruction(pDestructionFunction)
orazOnDeadReference()
. Pierwsza decyduje o czasie usunięcia instancji. Druga decyduje o zachowaniu w przypadku odwołania do martwej referencji.ThreadingModel
– sposób zachowania singletona podczas działania wielu wątków.
Przykład
template
<
class T,
template <class> class CreationPolicy,
template <class> class LifeTimePolicy,
template <class> class ThreadingModel
>
class SingletonHolder
{
public:
static T& instance();
private:
static void destroySingleton();
SingletonHolder();
typedef typename ThreadingModel<T>::VolatileType InstanceType;
static InstanceType* pInstance;
static bool destroyed;
};
template<...>
T& SingletonHolder <...>::instance()
{
if(!pInstance)
{
typename ThreadingModel<T>::Lock guard;
if(!pInstance)
{
if(destroyed)
{
LifetimePolicy<T>::OnDeadReference();
destroyed=false;
}else
{
pInstance=CreationPolicy::create();
LifetimePolicy<T>::ScheduleDestruction(& DestroySingleton);
}
}
}
return *pInstance;
}
template <...>
void SingletonHolder<...>::destroySingleton()
{
CreationPolicy<T>::destroy(pInstance);
pInstance=0;
destroyed=true;
}
Wytyczne szablonu SingletonHolder
CreationPolicy
– sposób tworzenia i usuwania instancji. Posiada metody statyczne create()
oraz destroy()
:
CreateUsingNew
– tworzy egzemplarz za pomocą operatoranew
i konstruktora domyślnego,CreateUsingMalloc
– tworzy egzemplarz za pomocą funkcjimalloc()
i konstruktora domyślnego,CreateStatic
– tworzy egzemplarz w pamięci statycznej.
LifeTimePolicy
– sposób decydowania kiedy usunąć egzemplarz singletona. Posiada dwie metody: ScheduleDestruction(pDestructionFunction)
oraz OnDeadReference()
. Pierwsza decyduje o czasie usunięcia instancji. Druga decyduje o zachowaniu w przypadku odwołania do martwej referencji:
DefaultLifetime
– zarządza czasem życia obiektu zgodnie z regułami języka C++ (na bazie funkcjiatexit()
),PhoenixSingleton
– jak wDefaultLifetime
, ale dopuszcza ponowne utworzenie egzemplarza (funkcjaOnDeadReference()
),SingletonWithLongevity
– przypisuje egzemplarzowi żywotność. Zakłada obecność funkcjiGetLongevity()
, która wywołana z argumentempInstance
zwraca żywotność podaną dla egzemplarza singletona,NoDestroy
– nie usuwa egzemplarza singletona.
ThreadingModel
– sposób zachowania singletona podczas działania wielu wątków:
SingleThreaded
,MultiThreaded
.