Singleton-mønsteret er et av de enklere designmønstrene. En klasse som bruker singleton-designmønsteret har en enkelt forekomst som den administrerer på egen hånd. Denne klassen forhindrer andre i å opprette en forekomst av den.

En singleton-klasse gir også et enkelt globalt tilgangspunkt til forekomsten den oppretter. Så, enhver klasse som ønsker en forekomst av en singleton-klasse, må få tilgang til den gjennom sitt enkelt tilgangspunkt.

Javas utmerkede støtte for objektorientert programmering gjør det enkelt å bruke singleton-designmønsteret.

Implementering av Singleton-mønsteret ved hjelp av Java

Det er mange måter å implementere singleton-mønsteret på i Java; de ivrige og late tilnærmingene er vanlige varianter. Hver av disse tilnærmingene har sine egne fordeler og ulemper. Derfor bør metoden du velger å bruke, avhenge av hvordan applikasjonen din vil fungere.

Den ivrige tilnærmingen

Implementering av singleton-mønsteret med den ivrige tilnærmingen betyr at klassen lager en ny forekomst av seg selv når den lastes.

offentligklasseIvrigSingleton{
privatstatisk EagerSingleton-forekomst = ny IvrigSingleton();

privatIvrigSingleton(){}

offentligstatisk IvrigSingleton getInstance(){
komme tilbake forekomst;
}
}

De IvrigSingletonJava klasse oppretter en ny forekomst av seg selv mens den lastes inn. Den tilordner denne forekomsten til den private statiske instansvariabel, som kun er tilgjengelig innenfor singleton-klassen. Det eneste punktet for ekstern tilgang til forekomstvariabelen er gjennom getInstance() metode. Denne metoden returnerer den tidligere opprettede forekomsten av klassen.

Denne tilnærmingen er flott da den forhindrer flertråding problem, som er en av de største utfordringene med singleton-mønsteret. Det løser multithreading-problemet ved å lage en ny forekomst av seg selv før en ny tråd kan få tilgang til forekomstvariabelen. Dette garanterer at hver tråd bare vil ha tilgang til samme instans.

Den ivrige tilnærmingen er imidlertid bare praktisk hvis applikasjonen din vil bruke en forekomst av singleton-klassen når den begynner å kjøre. Ellers vil du opprette et objekt før applikasjonen trenger det, og bruke ressurser unødvendig.

Den late tilnærmingen

Den late tilnærmingen er løsningen på problemet med ivrig tilnærming. Den lar deg lage en ny forekomst av en singleton-klasse bare når programmet ditt trenger det.

offentligklasseLazySingleton{
privatflyktigestatisk LazySingleton-forekomst;

privatLazySingleton(){}

offentligstatisk LazySingleton getInstance(){
hvis (forekomst == null) {
synkronisert (LazySingleton.klasse) {
hvis (forekomst == null) {
forekomst = ny LazySingleton();
}
}
}

komme tilbake forekomst;
}
}

Den late tilnærmingen løser multithreading-problemet ved å bruke synkronisert nøkkelord. Dette forhindrer at to tråder får tilgang til instansvariabelen samtidig. Synkronisert er imidlertid dyrt, så applikasjonen bruker den bare én gang, når den først kaller getInstance().

Når skal man bruke Singleton-mønsteret

Singleton-mønsteret er nyttig i mange scenarier, for å lage dialogbokser, håndtere registerinnstillinger eller administrere trådpooler.

En annen vanlig bruk for singleton-mønsteret er å lage en sentral klasse som administrerer databaseforbindelser.