Singleton-mønsteret er et af de mere simple designmønstre. En klasse, der bruger singleton-designmønsteret, har en enkelt instans, som den administrerer på egen hånd. Denne klasse forhindrer enhver anden klasse i at oprette en forekomst af den.
En singleton-klasse giver også et enkelt globalt adgangspunkt til den instans, den opretter. Så enhver klasse, der ønsker en forekomst af en singleton-klasse, skal have adgang til den gennem sit enkelt adgangspunkt.
Javas fremragende understøttelse af objektorienteret programmering gør det nemt at bruge singleton-designmønsteret.
Implementering af Singleton-mønsteret ved hjælp af Java
Der er mange måder at implementere singleton-mønsteret på i Java; de ivrige og dovne tilgange er almindelige variationer. Hver af disse tilgange har sine egne fordele og ulemper. Derfor bør den metode, du vælger at anvende, afhænge af, hvordan din applikation vil fungere.
Den ivrige tilgang
Implementering af singleton-mønsteret med den ivrige tilgang betyder, at klassen opretter en ny instans af sig selv, når den indlæses.
offentligklasseIvrigSingleton{
privatstatisk EagerSingleton instans = ny IvrigSingleton();privatIvrigSingleton(){}
offentligstatisk IvrigSingleton getInstance(){
Vend tilbage eksempel;
}
}
Det IvrigSingletonJava klasse opretter en ny instans af sig selv, mens den indlæses. Den tildeler denne instans til den private statiske instansvariabel, som kun er tilgængelig inden for singleton-klassen. Det eneste punkt for ekstern adgang til instansvariablen er gennem getInstance() metode. Denne metode returnerer den tidligere oprettede forekomst af klassen.
Denne tilgang er fantastisk, da den forhindrer multithreading problem, som er en af de største udfordringer ved singleton-mønsteret. Det løser multithreading-problemet ved at oprette en ny instans af sig selv, før en ny tråd kan få adgang til sin instansvariabel. Dette garanterer, at hver tråd kun har adgang til den samme instans.
Den ivrige tilgang er dog kun praktisk, hvis din applikation vil bruge en forekomst af singleton-klassen, når den begynder at køre. Ellers vil du oprette et objekt, før din applikation har brug for det, ved at bruge ressourcer unødigt.
Den dovne tilgang
Den dovne tilgang er løsningen på problemet med ivrig tilgang. Det giver dig mulighed for kun at oprette en ny forekomst af en singleton-klasse, når dit program har brug for det.
offentligklasseLazySingleton{
privatflygtigestatisk LazySingleton forekomst;privatLazySingleton(){}
offentligstatisk LazySingleton getInstance(){
hvis (forekomst == nul) {
synkroniseret (LazySingleton.klasse) {
hvis (forekomst == nul) {
eksempel = ny LazySingleton();
}
}
}
Vend tilbage eksempel;
}
}
Den dovne tilgang løser multithreading-problemet ved hjælp af synkroniseret søgeord. Dette forhindrer to tråde i at få adgang til instansvariablen på samme tid. Synkroniseret er dog dyrt, så applikationen bruger det kun én gang, når det først kalder getInstance().
Hvornår skal Singleton-mønsteret bruges
Singleton-mønsteret er nyttigt i mange scenarier, til at oprette dialogbokse, håndtere indstillinger i registreringsdatabasen eller administrere trådpuljer.
En anden almindelig anvendelse af singleton-mønsteret er at skabe en central klasse, der administrerer databaseforbindelser.