Het singleton pattern is een bekend ontwerppatroon dat garandeert dat een class maar één exemplaar van zichzelf maakt, hoe vaak de code er ook om vraagt. Elk deel van het programma dat dat object nodig heeft, krijgt precies hetzelfde exemplaar, met één consistente staat.

Zie het als de verkeerstoren op een vliegveld. Er is er maar één, en elke piloot praat met diezelfde toren. Als elk vliegtuig zijn eigen privétoren had die andere instructies gaf, werd het een chaos. Een singleton werkt net zo: het is het ene gedeelde punt van coördinatie. Een klassiek voorbeeld uit de praktijk is de configuratie van een applicatie. Je laadt je instellingen één keer in één object, en elk scherm leest uit diezelfde bron in plaats van elk een eigen kopie te laden. Dit is een van de bekendere voorbeelden uit de familie van ontwerppatronen en hoort thuis in object-oriented programming.

Het patroon heeft een nadeel dat je moet kennen. Omdat een singleton overal bereikbaar is, kan hij je code stilletjes verstrengelen en geautomatiseerd testen lastiger maken. Als een functie stiekem een globale singleton binnentrekt, kun je in een test niet makkelijk een nepversie inzetten. Veel teams grijpen daarom naar dependency injection: het object wordt meegegeven, zodat je de code een stub kunt aanreiken.

Er is een venijnigere valkuil in moderne apps. Singletons gaan slecht samen met gelijktijdigheid. Als twee threads tegelijk hetzelfde exemplaar aanmaken, krijg je soms twee “singletons” of een half geschreven waarde, en daarom kennen Java en C# specifieke patronen om er veilig één te bouwen.

Behandel de singleton dus als een precies gereedschap, niet als standaard. Hij past bij een logger, een configuratieobject of een connectiepool, dingen waarvan er echt maar één hoort te zijn. Hij past niet bij gewone businessobjecten, waar een vers exemplaar per gebruik de code makkelijker te volgen houdt.

Bij TopDevs gebruiken we singletons waar één gedeelde resource echt logisch is, en laten we ze weg waar ze alleen maar verborgen koppeling zouden toevoegen.