最近在学习设计模式,做开发也挺久的了,一直没注意设计模式这块,其实设计模式这个东西对软件开发有很大的帮助,我们使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。
帮助我们将应用组织成容易了解,容易维护,具有弹性的架构,建立可维护的OO系统,要诀在于随时想到系统以后可能需要的变化以及应付变化的原则。
好了,先开始第一个设计模式的学习
1.单例模式
类也需要计划生育,所谓的单例模式就是指一个类只能有一个实例,并提供一个访问他的全局访问点。通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身负责保护它的唯一实例。这个类可以保证没有其他实例可以被创建,并且提供一个访问该实例的方法。
下面看代码:
public class SignLeton
{
// 定义一个静态变量来保存类的实例
private static SignLeton instance;
//程序运行时创建一个静态只读的进程辅助对象
private static readonly object syncRoot = new object();
private SignLeton()
{
}
/// <summary>
/// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
/// </summary>
/// <returns></returns>
public static SignLeton GetInstance()
{
if (instance == null) //双重锁定
{
lock (syncRoot)
{
// 如果类的实例不存在则创建,否则直接返回
if (instance == null)
{
instance = new SignLeton();
}
}
}
return instance;
}
}
上面的代码就是一个简单的单例模式,在类中定义了一个私有的构造函数,使得SignLeton类不能直接被实例化。但是我们可以访问SignLeton类中的GetInstance这个方法,判断SignLeton类是否被实例化,没有实例化就创建一个实例。是由类自身控制。
这里用到了lock(锁),lock 是确保当一个线程位于代码的临界区时,另一个线程不进入临界区。如果其他线程试图进入锁定的代码,则它将一直等待,直到该对象被释放,其他线程才能进入。也许你们会问这里双重锁定是什么,这是为了保证多线程的安全的做法。这样我们不用每次访问这个方法的时候让线程都去加锁,而只是在实例化未被创建的时候再加锁处理。
为什么还要在lock里在判断一次instance是否被实例化?
假如有多个线程同时调用GetInstance()这个方法,并且都通过第一次的instance == null的判断,然后由于lock机制,一个线程进入,其他线程必须等待。而此时如果没有第二次的instance等于null 的判断,则第一个线程创建了实例,那么第二个线程进来后是否会继续创建新的实例呢?答案是肯定的,这样就达不到单例的目的了。
单例模式就是如此,之后每天都会学习两个设计模式并且会对其中的一些方法原理作出详细解释。每天更新一个,自勉加油。