Skabelsesmønster: 1. Singletonmønster

Hvad er et skabelsesmønster?

(26. dec. 2020)

Skabelsesmønstre beskæftiger sig med oprettelse eller kloning af nye objekter i en klasse. Kloning opstår, når der allerede findes en lignende form for objekt, og i stedet for at instantiere et nyt objekt, kloner vi det eksisterende.

De forskellige måder at skabe objekter vil i høj grad påvirke, hvordan et problem løses. Forskellige sprog påvirker derfor, hvilke mønstre der er mulige at bruge.

Singleton-mønster

Singleton-mønster bruges, når vi kun kræver en enkelt forekomst af en klasse. For eksempel opretter DB-forbindelse i et program, printerens udskriftskø ved hjælp af loggere, da de kræver mange ressourcer. I alle disse tilfælde, hvis der er flere forekomster, vil det skabe forvirring såvel som inkonsekvens.

Dette mønster bruges, når forekomsten deles og er tilgængelig globalt i hele applikationen. At sikre, at adgang til delte ressourcer er trådsikker, er et meget godt eksempel på, hvor denne type mønster kan være afgørende. hensigten med et Singleton-mønster er at give global adgang til en klasse, der er begrænset til en forekomst.

Lad os se, hvordan objektet oprettes

public class DummyClass{ DummyClass(){}
}DummyClass dc = new DummyClass(); //every time when this line is called a new object of DummyClass is created

Nu, når der er behov for et objekt af DummyClass, kaldes konstruktøren, og der oprettes et objekt. Dette kaldes Eager initialization.

Men i singleton-mønster kræver vi kun en enkelt forekomst af en klasse. Sig, hvis en DB-forbindelse allerede er konfigureret, behøver vi ikke oprette en ny DB-forbindelse og skal bruge den allerede eksisterende forbindelse. Lad os se, hvordan man opnår det.

Her har vi begrænset konstruktørens omfang til selve klassen. Så for at oprette objektet i denne klasse skal getDBConnection () statisk metode til klassen kaldes. Derefter kontrolleres, om dbConnection-objektet er nul, derefter oprettes et nyt forbindelsesobjekt og returneres, ellers returneres det eksisterende forbindelsesobjekt.

Dette eksempel demonstrerer begrebet doven initialisering . Det betyder, at vi ikke skaber klassens objekt, medmindre det virkelig er nødvendigt. Derfor er dette program mere effektivt med hensyn til ressourcer.

Der er kompromiser med Singleton-designprincippet. Hvis der kører flere computertråde, kan der være problemer, der skyldes, at tråde forsøger at få adgang til det delte enkeltobjekt.

Problemer i ovenstående implementering

Nu er det muligt, at to tråde på samme tid kalder getDBConnection-metoden, og objektet oprettes ikke endnu. For begge tråde vil dbConnection-objektet være nul, og de prøver begge at oprette en ny forekomst og bruge det i stedet. Det er derfor meget vigtigt at sikre, at en enkelt tråd kan få adgang til getDBConnection ad gangen, så der ikke oprettes flere forekomster.

At opnå en tråd -sikker singleton-klassen er at synkronisere den globale adgangsmetode, så kun en tråd kan udføre denne metode ad gangen.

Kun en tråd kan få adgang til denne synkroniserede kodeblok ad gangen

Du tænker måske, at problemet er løst nu. Men desværre nej! For at håndhæve singleton-ejendommen sætter vi en lås på den statiske getDBConnection-metode, men kompromitterer dens ydeevne på samme tid. Når et objekt allerede er oprettet, skal flere tråde også vente på at få den eksisterende forekomst af objektet. Kan vi gøre noget bedre? Lad os se.

Da det er tydeligt, at lås kun kræves, når forekomsten er nul, så forskellige tråde ikke opretter flere forekomster. Så vi kan placere en synkroniseret tilstand inde i hvis-tilstanden, hvor vi kontrollerer, om forekomsten er nul eller ej, og tilføje en dobbeltkontrol for at eliminere scenarierne for flere forekomster. / div>

I reel brug kan singleton-mønsteret implementeres på forskellige måder. Det definerer bare det grundlæggende formål, som dette mønster tjener, men implementeringen af ​​koden kan variere.

Det er alt fra min side. Jeg håber, det er klart nu, hvor, hvornår og hvordan man bruger singleton-designmønsteret. Du kan henvise til bogen, Gang of Fours designmønster katalog for mere forståelse.

Giv mig besked i kommentarerne nedenfor, hvis du er i tvivl. Hvis du kan lide denne blog, så del den med dine venner. Glad software engineering!

Del 2: