Cytat
A ja myślę, że to nie jest taki całkiem singleton, bo w tym wzorcu konstruktor MUSI być prywatny, bo jak inaczej chesz wymusić na programiście-kliencie używanie jakiejś metody do towrzenia instancji klasy? A tak robisz prywatny konstruktor i klasa sama w sobie tworzy obiekt i zwraca referencję do niego.
Tak jak mowisz, tyle ze w jak napisal juz hawk w php4 nie da sie tak zrobic bo nie ma modyfikatorow dostepu. Ten kod jest wynikiem metamorfozy tego:
Kod
#include <iostream>
using namespace std;
class Singleton {
static Singleton *instance;
Singleton() : cos(0)
{
cout << "Singleton::Singleton()n";
}
public:
int cos;
static Singleton* GetInstance()
{
if (Singleton::instance == NULL)
{
Singleton::instance = new Singleton;
}
return Singleton::instance;
}
};
Singleton* Singleton::instance = NULL;
int main()
{
Singleton *a, *b, *c;
a = Singleton::GetInstance();
b = Singleton::GetInstance();
c = Singleton::GetInstance();
cout << a->cos << ", " << b->cos << ", " << c->cos << endl;
a->cos++;
cout << a->cos << ", " << b->cos << ", " << c->cos << endl;
b->cos++;
cout << a->cos << ", " << b->cos << ", " << c->cos << endl;
return 0;
}
Jest to kod, ktory "stworzylem" przed tym w php, zeby sie upewnic, ze da sie zrobic "idealny" singleton (obiekt tworzony tylko i wylacznie za pomoca statycznej metody), kod jest w Cpp i staralem sie maxymalnie go odzwierciedlic, ale jak widac malo z tego co mozna w Cpp da sie w php4, stad ta umowna prywatnosc konstruktora.
Cytat
W sumie w rozwiazaniu FiDO nie podoba mi sie to, ze instancja jest przechowywana w metodzie, ale moze to jedyne rozwiazanie...
Niestety chyba jedyna, tez wolalbym zeby to wygladalo tak jak w przykladzie wyzej, ale w php4 nie ma statycznych pol w klasach, wiec mozna tylko tak.