Singleton – på den nemme måde

by Jesper juli 16, 2008 23:29

Jeg bruger af og til et Singleton-pattern i mine applikationer, og jeg kan efterhånden laver skelet koden for til disse Singleton klasser i søvne. Det er alt sammen ok, men nu har vi efterhånden haft generics i 3-4 år. Jeg mener: Jeg bruger klasser med generics hver dag, men hvor ofte laver man klasser der udnytter det selv?

Ikke ret tit vel?

Tilbage til mine applikationer der har brug for en Singleton-konstruktion. Det tog mig 10 minutter, da ideen først havde slået mig:

[code=csharp]public class Singleton where T : class, new() { private static T _instance; static Singleton() { _instance = new T(); } public static T Instance { get { return _instance; } } } [/code]

Og når den skal bruges:

[code=csharp]Singleton.Instance.Append("Ya-di-ya");[/code]

Det var bare mit lille Tip of the Day, her i ferietiden.


Tilføjelse - Tak til Guidmaster der gør opmærksom på threading problematikken. Jeg har planket hans kode, og nu ser klassen således ud:

[code=csharp]public class Singleton where T : class, new() { private static T _instance; private static object ged; static Singleton() { ged = new object(); _instance = new T(); } public static T Instance { get { lock (ged) { return _instance; } } } } [/code]

Tags:

Kommentarer

16-07-2008 21:14:05 #

guidmaster

Det ligner jo en hel del det jeg skrev på dotnetforum.dk/.../69904.aspx for et par år siden. Min løsning har så et par krøller på - nemlig at den også er thread safe og også kan bruges på objekter der ikke har en default constructor.

guidmaster Denmark

17-07-2008 00:50:50 #

Jakob Andersen

Hvis du nu brugte en IOC container som du har blogget om på det sidste. Ville denne kunne styre dine objekters lifespan herunder også hvilke der skulle være Singleton

Jakob Andersen Denmark

17-07-2008 00:50:53 #

Jesper

Guidmaster> God pointe - jeg har starks forbedret klassen Smile

Jesper Denmark

17-07-2008 00:52:56 #

Jesper

Jacob> Yeps, hvis jeg f.eks. bruger Windsor, men jeg hænger stadig på mit "10 linie framework" Smile

Jesper Denmark

17-07-2008 03:21:21 #

Tinus

Du burde iøvrigt også læse denne fine artikel:
http://www.yoda.arachsys.com/csharp/singleton.html

Tinus

17-07-2008 04:14:53 #

Jesper

Tinus> Ja det understreger jo bare, at der ikke findes originale ideer i udvikling. Lige meget hvor smart man så end synes man er, så er der altid en der har været smart(ere) før en selv Wink

Jesper Denmark

17-07-2008 04:33:23 #

Tinus

Det var skam ikke fordi jeg ikke mener det er smart - det var mere med hensyn til den opdaterede implementation og thread safety Smile

(jeg syntes også jeg har skrevet min del singeltons efterhånden....)

Tinus

03-08-2008 13:47:18 #

Thomas

Hvorfor er det egentligt, at det første forsøg ikke var trådsikkert?

Den statiske konstruktør er garanteret at køre højest een gang (den kan fejle) før første metode kald. For man ikke en statisk konstruktør pr konkret type?

Thomas Denmark

06-08-2008 00:30:16 #

Jesper

Thomas> Ja du har ret i at konstruktøren er trådsikker. Det vil jeg ændre asap.
Tilgangen til instans property'en, giver det derimod god mening at kode med lås, da den kan tilgås fra alle tråde, med potentielle deadlocks osv.

Jesper Denmark

06-08-2008 02:50:17 #

Thomas

Jeg mener ikke, at der kan opstå trådproblemer ifm returnering af en reference (deadlocks kan jeg ikke se hvordan skulle opstå. En race-condition, måske, men referencetilgang, herunder returnering af en reference er atomare iirc).

Thomas Denmark

Kommentarerne er lukkede

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen | Modified by Mooglegiant

About

Mit navn er Jesper Jensen, og jeg arbejder til dagligt som web-udvikler hos DGI, hvor mit speciale er klientside applikationer. Før det var jeg nogle år i robotbranchen, hvor jeg arbejdede med 3D simulering og system koordinering. Jeg elsker webudvikling, og specielt JavaScript har min interesse. Jeg har blogget om mine oplevelser med udvikling siden 2004

Calendar

<<  september 2010  >>
mationtofr
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

View posts in large calendar

RecentComments

Comment RSS