单例模式(Singleton Pattern)是 C#中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。
意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。
主要解决:一个全局使用的类频繁地创建与销毁。
何时使用:当您想控制实例数目,节省系统资源的时候。
如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。
关键代码:构造函数是私有的。
优点:
缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。
使用场景:
使用双if+lock这种方式实现最大的优点就是线程安全,缺点是加锁影响效率。
源码
//双if+lock
class Sigleton
{
private Sigleton()
{
}
private static Sigleton _Sigleton=null;
private static Object sigleton_lock = new object();
public static Sigleton CreateInstance()
{
if(_Sigleton==null)
{
lock (sigleton_lock)
{
if (_Sigleton == null)
{
_Sigleton = new Sigleton();
}
}
}
return _Sigleton;
}
}
1静态函数没有修饰符修饰(默认修饰符为private,但是你不能写出来)
2.静态构造函数是系统默认调用的,程序员无法手动调用
3.如果类中没有静态构造函数,而此时类中包含静态字段(未初始化的)那么此时编译器会默认生成静态构造函数
4.在静态类中或方法中,不能使用对象
5.如果类中包含静态成员,且没有被初始化,系统会默认提供一个默认的值,这也间接说明了我们不可以直接调用静态构造函数,这也没办法控制静态函数的执行时间
6.静态构造函数只能被调用一次,并且不能有重复
7.静态构造函数不能有参数
8.虽然静态构造函数和普通构造函数名字一样,但是系统规定他俩可以共存,尽管参数列表一样
9.静态构造函数是在普通构造函数调用之前执行,一般情况下用于初始化静态字段或者拦截在实例化之前
静态构造函数:由CLR保证,在第一次使用这个类之前,调用而且只调用一次
源码
//单利模式第二种写法
class SigletonSecond
{
private SigletonSecond()
{
}
private static SigletonSecond _Sigleton = null;
//静态构造函数:由CLR保证,在第一次使用这个类之前,调用而且只调用一次
static SigletonSecond()
{
_Sigleton = new SigletonSecond();
}
public static SigletonSecond CreateInstance()
{
return _Sigleton;
}
}
静态变量:会在类型第一次使用的时候初始化,而且只初始化一次
源码
//单利模式第三种写法
class SigletonThird
{
private SigletonThird()
{
}
//静态变量:会在类型第一次使用的时候初始化,而且只初始化一次
private static SigletonThird _Sigleton = new SigletonThird();
public static SigletonThird CreateInstance()
{
return _Sigleton;
}
}
在内存中只有一个对象,节省内存空间;
避免频繁的创建销毁对象,可以提高性能;
避免对共享资源的多重占用,简化访问;
为整个系统提供一个全局访问点。