1、单线程下Singletion对象实现
class Singletion
{
//单线下的单件模式
private static Singletion instance;
private Singletion(){}//保证实例不被初始化,c#编译器默认都会构造一个无参的构造器。加private对它进行私有化出来后就可以避免让编译器默认构造。
public static Singletion Instance
{
get
{
if (instance == null)
{
instance= new Singletion();
}
return instance;
}
}
}
2、多线程下Singletion对象实现,关键字volatile 很重要 告诉编译器按照我写的代码顺序进行编译。因为c#编译器
有可能对我写的代码的编译顺序进行微调。
class Singletion
{
private static volatile Singletion instance=null;
private static object lockHelper = new object();
private Singletion() { }
public static Singletion Instance
{
get
{
if (instance == null)
{
lock (lockHelper) //加上一个锁,多个线程执行时候有可能都会执行到这里(几率很少但可能发生),这样的话,就失去了Singletion的意义。
{
if (instance == null)
{
instance = new Singletion();
}
}
}
return instance;
}
}
}
3、静态的Singletion 只是对于无参数的构造器使用。如果带有参数可以采用属性+方法进行分离。
如:class Singletion{
public static readlonly Singletion instance=new Singletion();
private static(){}
}
注意:这三种方式创建Singletion时 都必须改写 Singletion 默认构造器(private static(){})因为:c#
编译器在编译时会给类默认添加无参构造器。所以我们要改写。(private即外部访问不到)
Singletion 模式学习的扩展思考:
1、如何将一个实例扩展到n各实例?即只能创建n个实例。
2、c#如何实现对象池?
3、多个类协同工作环境中如何运用Singletion?
4、如何控制用户new对一个类的实例构造器的任意调用?
.net 框架中Singletion应用
Type类型其实内部实现了Singletion模式的运用
MyClass t1=new MyClass();
MyClass t2=new MyClass();
Type type1=t1.GetType();
Type type2=t2.GetType();
保证type1,type2唯一。只要type1,type2的实际对象一样,他的引用对象也
就一样。
即type1==type2;
另一个就是net中的HttpContext.Current 在局部领域也是一个Singletion
模式的实现。