Singleton w “czystym” C++, a C++/CLI

Ha! To mój pierwszy post napisany w 2012 roku (oprócz oczywiście posta związanego z podsumowaniem statystycznym blogu)! Opiszę jak stworzyć często używany prosty kreacyjny wzorzec projektowy jakim jest singleton. Problem polega na tym że w środowisku uruchomieniowym wspólnego języka (CLR) nie możemy użyć tej samej wersji singletona co w “czystym” C++, tak jak np. w takiej wersji:

class singleton
{
private:
singleton() { }
singleton(const singleton &);
singleton& operator=(const singleton&);
public:
string method() { return “singleton pattern\n”; }
static singleton& getInstance()
{
static singleton instance;
return instance;
}
};

W powyższym przykładzie obiekt zostanie zainicjalizowany dzięki metodzie getInstance i tylko przy jej pierwszym użyciu, każde kolejne zwróci referencję do tego obiektu. Taki singleton można używać w następujący sposób:

singleton::getInstance().method()

Jest to wywołanie metody method, z instancji singleton’u.

Jeżeli piszemy w C++/CLI powyższa implementacja nie zadziała i musimy spróbować czegoś innego, moja propozycja jest taka:

ref class Singleton
{
private:
static Singleton m_instance;
public:
Singleton() {}
static property Singleton^ Instance { Singleton^ get() { return %m_instance; } }
};

A instancjami takiego singletona powołujemy do życia w następujący sposób:

Singleton ^ singInst;
singInst = gcnew Singleton();

Moim zdaniem CLI, czyli język programowania oparty na C++ wprowadzony przez Microsoft, utrudnia życie i tylko dla nich jest ułatwieniem sobie niektórych rozwiązań.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s