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 statyczne create() oraz destroy().
  • 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.
  • 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ą operatora new i konstruktora domyślnego,
  • CreateUsingMalloc – tworzy egzemplarz za pomocą funkcji malloc() 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 funkcji atexit()),
  • PhoenixSingleton – jak w DefaultLifetime, ale dopuszcza ponowne utworzenie egzemplarza (funkcja OnDeadReference()),
  • SingletonWithLongevity – przypisuje egzemplarzowi żywotność. Zakłada obecność funkcji GetLongevity(), która wywołana z argumentem pInstance 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.

część 10

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.