C#中单例模式的⼏种实现⽅式
单例模式中,实现⽅式有以下⼏种,⾃⼰简单地总结了⼀下。其中,通过⼀次判空(只适⽤于单线程环境)和⼀次判空加锁(多线程,但效率不⾼),这两种⽅法就不多说了,下⾯只陈述改良之后的⽅法:
⽅法⼀:通过加锁,两次判空实现单例模式
public sealed class SingleTon1
//由sealed修饰的类或⽅法将不能被继承或是重写。
{
private SingleTon1(){}
private static readonly object MyLock =new object();
private static SingleTon1 instance =null;
单例模式的几种实现方式public static SingleTon1 GetInstance()
{
//第⼀次判断省去加锁的过程消耗
if(instance ==null)
{
//多线程中保证只有⼀个线程能够创建实例
lock(MyLock)
{
//加锁过程也是多线程,所以需要再次判断
if(instance ==null)
{
instance =new SingleTon1();
}
}
}
return instance;
}
}
这⾥解释⼀下private SingleTon1() { } 构造函数私有化,外部类不可以new它,但是需要写⼀个⽅法将⾃⼰new的return 出去,如⽅法getInstance()。
单例模式有以下特点:
1、单例类只能有⼀个实例。
2、单例类必须⾃⼰创建⾃⼰的唯⼀实例。
3、单例类必须给所有其他对象提供这⼀实例。
看好第三点的,必须,必须给其他对象提供,否则就不能称之为单例了。
单例模式保证了全局对象的唯⼀性,避免了⼀次创建多个对象
⽅法⼆:借助C#独有的特性,利⽤静态变量实现单例模式
public sealed class SingleTon2
{
private SingleTon2(){}
private static readonly SingleTon2 Instance =new SingleTon2();
public static SingleTon2 GetInstance()
{
return Instance;
}
}
如果没有在类中写构造函数,那么框架会为我们⽣成⼀个构造函数,那么如果我们在类中定义了静态变量,但是⼜没有定义静态构造函数,那么框架也会帮助我们来⽣成⼀个静态构造函数来让框架⾃⾝来调⽤。
⽅法三:利⽤静态构造函数实现,与⽅法⼆同理
public sealed class SingleTon3
{
private SingleTon3(){}
private static readonly SingleTon3 Instance =null;
static SingleTon3()
{
Instance =new SingleTon3();
}
public static SingleTon3 GetInstance()
{
return Instance;
}
}
静态构造函数只执⾏⼀次,在静态构造函数中初始化静态变量,这样就保证了只初始化⼀次实例。但是,只要第⼀次⽤到Singleton3的时候就会执⾏静态构造函数,如果不需要创建实例,就会⽩⽩浪费资源,于是,下⾯的⽅法
⽅法四:按需创建实例
public sealed class SingleTon4
{
private SingleTon4(){}
public static SingleTon4 GetInstance()
{
return Nested.Instance;
}
//创建⼀个嵌套类
class Nested
{
internal static readonly SingleTon4 Instance =null;
static Nested()
{
Instance =new SingleTon4();
}
}
}
类型Nested只有在调⽤SingleTon4 GetInstance()的时候才⽤到,由于其私有属性,他⼈⽆法使⽤Nested类型。因此,当我们第⼀次通过GetInstance()得到SingleTon4的实例时,会⾃动调⽤Nested的静态构造函数来创建实例Instance;如果我们不调⽤⽅法GetInstance()就不会触发.NET运⾏时调⽤Nested,也就不会创建实例,真正实现了按需创建。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论