不积跬步,无以致千里;不积小流,无以成江海

用泛型做一个通用的单件模式

相信大家经常用到单件模式.经常重复的写着部分代码来实现单件.我粘一段可以重用的单件模式供大家参考.与以前的大家经常写的相比,各有优缺点,各位自行取舍.

 

    public class SingletonDome

    {

        public SingletonDome()

        {

        }

 

        public static SingletonDome instance

        {

            get

            {

                return Singleton<SingletonDome>.Instance;

            }

        }

    }

 

    public class Singleton<T> where T : new()

    {

        public static T Instance

        {

            get { return SingletonCreator.instance; }

        }

 

        class SingletonCreator

        {

            internal static readonly T instance = new T();

        }

    }

 

先说优点:正如大家所见,只需要调用泛型 Singleton<T>.Instance就可以实现单件模式了.而且可以重用,任何要实现单件的类都是一句话就行了.

缺点:由于在类SingletonCreator 里面要实例化具体的类,导致类的构造函数必需让Singleton<T>可以访问,可能导致调用者直接new一个实例而不使用单件(根据回复.修改了一下,另外线程是安全的)

posted on 2007-07-17 14:25 Dream.Lee 阅读(2050) 评论(10) 编辑 收藏

Feedback

#1楼 2007-07-17 15:00 Anders06      

Singleton的意义在于保存状态,而且只是方法.

>>而且可以重用,任何要实现单件的类都是一句话就行了.
难道所有的Singleton类的成员都一样? 显然这是木法重用滴

internal SingletonDome()

{

}

定义为internal是有问题的
 回复 引用 查看   

#2楼[楼主] 2007-07-17 15:37 adonio      

@Anders06
>>难道所有的Singleton类的成员都一样
这就是泛型的的作用.Singleton<SingletonDome>.Instance返回的实例是SingletonDome,如果你用Singleton<youclass>.Instance返回的就是youclass了
 回复 引用 查看   

#3楼 2007-07-17 15:57 江南白衣      

线程安全吗?  回复 引用 查看   

#4楼 2007-07-17 16:00 Edward[未注册用户]

在NGeneric中已经有该功能的实现,你可以到codeplex去看一看。  回复 引用   

#5楼 2007-07-17 16:55 zoti      

我以前是用HashTable做的,不知道和這種方式哪些效率好一點

另外不知道這個方法,像三樓說的線程是否安全

internal SingletonDome() 要改為public,否則編譯不過。

還有,SingletonCreator類是不是多余的?可以把
internal static readonly T instance = new T();
放到Singleton<T> 里面去就好了嘛,如下:

public class Singleton<T> where T : new()
{

internal static readonly T instance = new T();


public static T Instance
{

get { return instance; }

}
}
 回复 引用 查看   

#6楼[楼主] 2007-07-17 17:10 adonio      

@江南白衣
@zoti
这样就是为了保证线程安全.以前园子里有人讨论过这个
class SingletonCreator
{
internal static readonly T instance = new T();
}
 回复 引用 查看   

#7楼 2007-07-17 22:30 yunhuasheng      

@zoti
我觉得你的这个方法比较好!!
 回复 引用 查看   

#8楼 2007-07-18 11:22 zoti      

@yunhuasheng 我只是在樓主的基礎上小改了一下而已,主要是樓主的這個方法不錯。

@adonio 如果SingletonDome申明為public,那就沒辦法保証是單件了,因為在別的地方一樣可以new了但,但如果不用public,就滿足不了where T : new()

我的方法是用HastTable和如下的方法:
type.GetConstructor(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Public, null, new Type[] { },null).Invoke(null);
 回复 引用 查看   

#9楼 2007-07-18 17:18 Anders06      

>>Singleton<SingletonDome>.Instance返回的实例是SingletonDome
这个前提就是要保证SingletonCreator能够调用SingletonDome的构造函数对不?那么其访问修饰符至少的internal,这样的话能达到你的目的,但client还是能new出SingletonDome对象,这明显要受有约束.
 回复 引用 查看   

#10楼 2009-01-09 14:50 ssssssssssssssssssssss[未注册用户]

public static class Singleton<T>
{
/*
do something;
*/
}

使用静态的类不就可以了。
 回复 引用