Skapande designmönster: 1. Singletonmönster

Vad är ett skapande designmönster?

(26 dec 2020)

Skapande designmönster handlar om skapande eller kloning av nya objekt i en klass. Kloning sker när en liknande typ av objekt redan finns och istället för att starta ett nytt objekt klonar vi det befintliga.

De olika sätten att skapa objekt påverkar i hög grad hur ett problem löses. Olika språk påverkar därför vilka mönster som är möjliga att använda.

Singleton-mönster

Singleton-mönster används när vi bara behöver en enda instans av en klass. Till exempel att skapa DB-anslutning i ett program, skriva ut kö för skrivaren, med hjälp av loggare eftersom de kräver mycket resurser. I alla dessa fall, om det finns flera instanser, kommer det att skapa förvirring såväl som inkonsekvens.

Det här mönstret används när förekomsten delas och är tillgänglig globalt i hela applikationen. Att se till att tillgång till delade resurser är trådsäker är ett mycket bra exempel på var denna typ av mönster kan vara avgörande. avsikten med ett Singleton-mönster är att ge global åtkomst till en klass som är begränsad till en instans.

Låt oss se hur objektet skapas

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

Nu närhelst ett objekt av DummyClass behövs anropas konstruktorn och ett objekt skapas. Detta kallas Eager initialization.

Men i singleton-mönster behöver vi bara en enda instans av en klass. Säg, om en DB-anslutning redan är konfigurerad behöver vi inte skapa en ny DB-anslutning och vi bör använda den redan befintliga anslutningen. Låt oss se hur man uppnår det.

Här har vi begränsat konstruktörens omfattning till själva klassen. Så, för att skapa objektet för denna klass måste getDBConnection () statisk metod för klassen anropas. Den kontrollerar sedan om dbConnection-objektet är null, skapar sedan ett nytt anslutningsobjekt och returnerar annars returnerar det befintliga anslutningsobjektet.

Detta exempel visar begreppet lat initiering . Det betyder att vi inte skapar klassens objekt om det inte verkligen behövs. Därför är detta program mer effektivt när det gäller resurser.

Det finns kompromisser med Singletons designprincip. Om det finns flera datatrådar som körs, kan det finnas problem som orsakas av att trådarna försöker komma åt det delade enskilda objektet.

Problem i ovanstående implementering

Nu är det möjligt att två trådar samtidigt ringer till getDBConnection-metoden och objektet har inte skapats ännu. För båda trådarna kommer dbConnection-objektet att vara null och de försöker båda skapa en ny instans och använda den istället. Det är därför mycket viktigt att se till att en enda tråd kan komma åt getDBConnection åt gången så att flera instanser inte skapas.

För att uppnå en tråd -säker singleton-klassen är att synkronisera den globala åtkomstmetoden så att endast en tråd kan utföra den här metoden åt gången.

Endast en tråd kan komma åt detta synkroniserade kodblock i taget

Du kanske tänker att problemet är löst nu. Men tyvärr nej! För att genomdriva singleton-egenskapen låser vi den statiska getDBConnection-metoden men äventyrar dess prestanda samtidigt. När ett objekt redan har skapats måste flera trådar också vänta på att få den befintliga instansen av det objektet. Kan vi göra något bättre? Låt oss se.

Eftersom det är uppenbart att lås krävs endast när förekomsten är noll så att olika trådar inte skapar flera instanser. Så vi kan placera ett synkroniserat tillstånd inuti if-tillståndet där vi kontrollerar om förekomsten är null eller inte, och lägger till en dubbelkontroll för att eliminera scenarierna för flera instanser.

I verklig användning kan singletonmönstret implementeras på olika sätt. Det definierar bara det grundläggande syftet som detta mönster tjänar men kodimplementeringen kan skilja sig.

Det är allt från min sida. Jag hoppas att det är klart nu, var, när och hur man använder singleton-designmönstret. Du kan hänvisa till boken Gang of Fours designmönsterkatalog för mer förståelse.

Meddela mig i kommentarerna nedan om du är osäker. Om du gillar den här bloggen, vänligen dela den med dina vänner. Lycklig programvaruteknik!

Del 2: