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.
Wat bedoel je met een 'static class'. Dat bestaat bij mijn weten namelijk niet, wel statische methodes binnen een class. Die maken het mogelijk om een methode binnen een class aan te maken zonder een instantie van die class te genereren. Niet 'maar een' dus, maar geen (of zoveel je wilt). Daarmee is het significant anders dan het idee van een Singleton.
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
Een singleton class roep je niet aan met $class = new Class() maar met $class = Foo::getInstance(), waarbij Foo een fictieve class is. Als je de getInstance method/functie voor het eerst aanroept, maakt deze een object aan van de class Foo. Telkens wanneer je nu de class Foo gebruikt, wordt gebruik gemaakt van dit ene object. In de singleton class kun je gewoon "niet-statische" methods gebruiken. Voorbeeldje:
<?php
$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:
<?php
$dollar = 2;
$euro = ConvertMoney::DollarToEuro($dollar);
$dollar = ConvertMoney::EuroToDollar($euro);
?>
Hoop dat het een beetje duidelijk is zo.
Een voordeel van een singleton ten opzichte van een 'statische classe' is dat je een de mogelijkheid hebt om dependency injection te gebruiken om een relatie tussen twee classen aan tegeven. In tegenstelling tot een een aanroep naar 'Foo::bar()' te hardcoden.
TL;DR: het is ietsjes flexibeler.
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
Dos, maar dan gaan we voorbij aan het waarom van het singleton pattern. Als we toch de database class telkens injecteren, kunnen we het net zo goed geen singleton laten zijn, aangezien we toch 1 globaal object hebben die we overal injecteren.
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.