Witam,
Chce aby pewien zbior klas byl singletonem i nie mozna bylo ich klonowac. Stworzylem takze fabryke, za pomoca ktorej sa tworzone instancje. Wszystko dziala jak nalezy i w zasdzie pytanie rozchodzi sie jedynie o powtarzalnosc kodu.
Aby nie zezwalac na klonowanie obiektu, wystarczy zzdefiniowac prywatna/chroniona metode __clone(). No i nie chcialbym teraz w wielu klasach powielac:
private function __clone() {}
Tak z czystej ciekawości co to za "zbiór klas, które mają być singletonami"? Generalnie kopiuj to do każdej z osobna bądź skorzystaj z http://php.net/manual/pl/language.oop5.traits.php.
Np. obsluga bazy danych, konfiguracji globalnej, rejestr, ...
Baza danych nie powinna byc singletonem. Dosyc czesto w aplikacjacj korzysta sie z wielu baz danych
getDatabase() moze przyjmowac parametr, za pomoca ktorego okresla sie 'kanal'. Jak nie podasz parametru to zwraca ten sam objekt domyslnie, ale mozesz stworzyc inny. Tak czy inaczej, rzeczywiscie moze byc tak jak mowisz.
Co nie zmienia faktu ze jak juz robie taka fabryke, to nawet jesli jakas klasa ma nie byc singletonem, to pomyslalem ze warto to ujednolicic i uniemozliwic tworzenie obiektow bezposrednio za pomoca operatora new, a wymusic korzystanie z fabryki.
Tylko wtedy majac 20 klas nie chcialbym powielac kodu. Traits wydaja sie byc ciekawym rozwiazaniem. W kazdej klasie moglbym dorzucic use commonTrait; o podobnej zawartosci:
trait myTrait { protected function __construct() { parent::__construct(); } protected function __clone() { parent::__clone(); } }
Nie lepiej zacząć korzystać z jakiegoś service managera? Wtedy zawsze kiedy potrzebujesz zwraca 1 instancję.
Na przykładzie zenda https://github.com/zendframework/zend-servicemanager
Dependency Injection + Dependency Injection Container - Google
Singleton to antywzorzec - stosujesz go zazwyczaj wtedy jak do już istniejącego kodu spaghetti chcesz dodać nowe, niezależne elementy.
Jednak jak jeszcze masz mało praktyki to możesz śmiało go stosować - po pewnym czasie sam dojdziesz do tego, że korzystanie z Dependency Injection to jedyne rozsądne wyjście - mi to zajeło kilka lat.
http://php-di.org/
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)