PHP Singleton pattern
Wat heb je aan het Singleton design pattern in OOP? Als er ook gewoon static klassen bestaan?
Een singleton klasse is ook nog eens altijd static (naar mijn weten).
Singleton is bedoeld om altijd maar 1 instantie van een klasse te kunnen maken, als er al een instantie van de singleton klasse is, wordt die bestaande instantie teruggegeven.
Wat is hier anders aan dan een gewone static class? Want van een static class kun je toch ook maar maximaal 1 instantie maken? Dus ik snap het nut niet, maar wil het wel graag begrijpen.
Het idee van een Singleton is dat je altijd maar 1 instantie hebt en daarmee dat je geen dubbele functionaliteit/data krijgt. Zo zou het handig zijn om bijvoorbeeld maar 1 database object te hebben zodat elke database request door dat object en die connectie wordt afgehandeld. Merk op 'zou'. Het idee achter singletons en de implementatie ervan is zeer omstreden. Over het algemeen wordt het gezien als een slecht principe en iets dat je niet zou moeten gebruiken. Zie ook: http://nl.wikipedia.org/wiki/Singleton_%28ontwerppatroon%29
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$db = DB::getInstance();
$db->setQuery('SELECT foo FROM bar');
$db->executeQuery();
?>
$db = DB::getInstance();
$db->setQuery('SELECT foo FROM bar');
$db->executeQuery();
?>
Wat jij bedoelt met een "statische class" is waarschijnlijk een class die alleen statische methodes bevat. Dan praat je niet echt over een object, maar meer over een class met een aantal handige functies. Voorbeeldje:
Code (php)
1
2
3
4
5
2
3
4
5
<?php
$dollar = 2;
$euro = ConvertMoney::DollarToEuro($dollar);
$dollar = ConvertMoney::EuroToDollar($euro);
?>
$dollar = 2;
$euro = ConvertMoney::DollarToEuro($dollar);
$dollar = ConvertMoney::EuroToDollar($euro);
?>
Hoop dat het een beetje duidelijk is zo.
TL;DR: het is ietsjes flexibeler.
Gewijzigd op 21/01/2014 18:26:42 door Dos Moonen
Dos, je hebt door dat "singleton" en "dependency injection" elkaars grootste tegenpolen op de wereld zijn?
Singleton is om maar één instantie van een class te krijgen.
Je kunt prima een MySQL en PostgreSQL singleton classes hebben die elk maar één instantie (en dus connectie) toe laten maar beiden de zelfde Database interface implementeren.
Voor dependency injection moet je een object doorgeven. Met een singleton heb je een object, met een statische classe niet.
Maar zelf vond ik het ook een vreemd idee toen ik het schreef :p
Het singleton pattern is juist gemaakt dat je ondanks dat je de klasse niet injecteert je toch altijd toegang krijgt tot dat ene object, doordat je met een static method werkt om het instance te verkrijgen.
En daar zien we ook meteen waarom singleton zo'n anti-pattern is tegenwoordig als je kennis hebt gemaakt met Dependency Injection. Met singletons, registeries en dat soort dingen bepaal je in de klasse wat je nodig hebt. Daardoor kun je het nooit veranderen zonder al je klassen aan te passen.