Click here to Skip to main content
Licence 
First Posted 26 Jul 2005
Views 94,907
Bookmarked 53 times

Generic Singleton Provider

By | 26 Jul 2005 | Article
An article describing how to use Generics to create a singleton provider.

Introduction

Many people from different programming backgrounds should be familiar with the Singleton Pattern. Those who use it will find that they often have to write the same code each time they want to create a different Singleton class. With the advent of C# 2.0 Generics, it is possible to write this code only once.

Background

There are many articles about the Singleton Pattern. Probably the most comprehensive one for C# can be found here: "Implementing the Singleton Pattern in C#".

There is an increasing amount written about C# Generics. For example, a CodeProject article can be found here: "Generics in C# 2.0" by Ansil.

Using C# 2.0 Generics to achieve a reusable Singleton pattern

Using C# 2.0 Generics, it is possible to create what I have called a 'Singleton Provider'. This is a class that can be used repeatedly to instantiate a class as a singleton without having to re-write the singleton pattern code for that specific class. This has the added benefit of separating singleton code from the class code leaving the flexibility to use several instances of the class or using the class as a singleton.

The singleton code used in this example is based on the fifth example described in the above article about implementing the Singleton Pattern in C#:

    public sealed class Singleton
    {
        Singleton()
        {
        }

        public static Singleton Instance
        {
            get
            {
                return SingletonCreator.instance;
            }
        }
        
        class SingletonCreator
        {
            // Explicit static constructor to tell C# compiler
            // not to mark type as beforefieldinit
            static Nested()
            {
            }

            internal static readonly Singleton instance = new Singleton();
        }
    }

With an understanding of Generics, you can see that there should be no reason to replace the type arguments in this block of code with the typical 'T' found in Generics. If this is done, the code looks like this.

    public class SingletonProvider <T> where T:new()
    {
        SingletonProvider() {}

        public static T Instance
        {
            get { return SingletonCreator.instance; }
        }

        class SingletonCreator
        {
            static SingletonCreator() { }

            internal static readonly T instance = new T();
        }
    }

Note that the Generics must have a constraint on it. This constraint forces any type 'T' to have a default constructor, that is, a constructor that takes no parameters. This allows the SingletonCreator to instantiate the type 'T'.

So, how does one use the SingletonProvider? To understand how to use this, we need a test class. The test class has two features. The first is a default constructor that sets a timestamp member variable. The second is a public method that writes that timestamp using Debug.WriteLine. This setup means that no matter which thread uses this class in the Singleton Pattern, whenever that public method is called, it should output the same value.

    public class TestClass
    {
        private string _createdTimestamp;

        public TestClass ()
        {
            _createdTimestamp = DateTime.Now.ToString();
        }

        public void Write()
        {
            Debug.WriteLine(_createdTimestamp);
        }
    }

The class is used with the SingletonProvider as follows:

    SingletonProvider<TestClass>.Instance.Write();

Points of Interest

I have tested this code with a Dual Processor with hyper-threading enabled with 100 threads accessing the singleton. They all output the same value illustrating that this is a thread-safe generic way to create singletons.

I believe that this is a really neat illustration of how Generics can save you writing code.

History

This is the first iteration of this code, please provide any feedback as to whether you have used this or not or any problems that anyone has found with it!

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here

About the Author

davojc

Web Developer

United Kingdom United Kingdom

Member

I have been developing primarily with .NET for over 10 years now although I have previous experience with Java and C++.
 
Programming is very much only a work task. I rarely do anything programming related in my spare time.
 
And no, this isn't a recent picture Smile | :)

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralUsing this on Forms Pinmembernothinking5:24 2 Mar '07  
GeneralRe: Using this on Forms PinmemberAntonio David Gonzlez7:43 10 May '07  
AnswerRe: Using this on Forms PinmemberLusid Insanity9:41 14 May '07  
GeneralRe: Using this on Forms Pinmemberggeurts22:57 14 May '07  
GeneralRe: Using this on Forms Pinmembernothinking16:36 21 May '07  
AnswerRe: Using this on Forms Pinmemberggeurts5:47 22 May '07  
Questionusing SingletonProvider to create types on the fly PinmemberJonathan Karlen5:43 5 Feb '07  
AnswerRe: using SingletonProvider to create types on the fly Pinmembermercede21:12 18 Jul '08  
GeneralPointer to article where private on test class will prevent instantiation and force Singleton PinmemberWray Smallwood4:36 29 Nov '06  
QuestionThis way prevents a class being instantiated at all Pinmembercrellbar5:13 20 Apr '06  
AnswerRe: This way prevents a class being instantiated at all PinmemberStefan Prodan5:13 13 Nov '06  
AnswerRe: This way prevents a class being instantiated at all Pinmemberzapodlo14:45 24 Apr '07  
AnswerRe: This way prevents a class being instantiated at all Pinmemberradioman.lt@gmail.com20:51 2 Oct '07  
GeneralApp Domains Pinmembermonsteroftheid4:21 4 Aug '05  
Generalsingletoncreator PinmemberKeith Farmer9:33 26 Jul '05  
GeneralRe: singletoncreator Pinmemberdavojc23:10 26 Jul '05  
GeneralRe: singletoncreator PinmemberHarkos2:09 27 Jul '05  
GeneralRe: singletoncreator Pinmemberdavojc2:12 27 Jul '05  
If you look at the other comment and my responses, there is a solution to this using a C# 2.0 language feature which allows the constructor to be come internal (almost private) but still will allow the SingletonCreator to create the TestClass.
 
I have updated the article to include this, I am just waiting for it to be updated on CodeProject.
 
David Coleman
Footballer and Gentleman
GeneralRe: singletoncreator PinmemberRichard Deeming8:35 28 Jul '05  
GeneralRe: singletoncreator PinmemberGoran Mitrovic20:55 27 Jul '05  
GeneralRe: singletoncreator Pinmemberdavojc22:31 27 Jul '05  
GeneralInteresting PinmemberS. Senthil Kumar5:47 26 Jul '05  
GeneralRe: Interesting Pinmemberdavojc22:56 26 Jul '05  
GeneralRe: Interesting Pinmemberdavojc23:47 26 Jul '05  
GeneralRe: Interesting PinmembermSerg21:37 2 Aug '05  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120529.1 | Last Updated 26 Jul 2005
Article Copyright 2005 by davojc
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid