背景:
在机房合作之前我们就商量好了都用哪些设计模式,而单例模式也是我们最先想到的,之前是用的vb.net敲的机房,所以在敲C#版的时候,上手有点困难,后来在一次一次尝试的过程中,终于实现了单例模式。
1、首先来看看什么是单例模式:
从“单例”字面意思上理解为一个类只有一个实例,所以单例模式也就是保证一个类只有一个实例的一种实现方法罢了(设计模式其实就是帮助我们解决实际开发过程中的方法, 该方法是为了降低对象之间的耦合度),下面给出单例模式的一个官方定义:确保一个类只有一个实例,并提供一个全局访问点。
光说可能还是不太明白,下面来看单例模式的结构图(图有点简单):
2、为什么要有单例模式?
首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了,比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个,这里就可以通过单例模式来避免两个打印作业同时输出到打印机中,即在整个的打印过程中我只有一个打印程序的实例。简单说来,单例模式(的作用就是保证在整个应用程序的生命周期中任何一个时刻,单例类的实例都只存在一个(当然也可以不存在)还有IO处理,数据库操作等,由于这些对象都要占用重要的系统资源,所以我们必须限制这些实例的创建或始终使用一个公用的实例
3、实现单例的艰辛历程:
在机房合作的时候我们的主窗体用的是MDI窗体,也因为这个带来了许多的问题,如果单纯show的话就会出现遮挡的效果,所以我们用到了类似VB一样的技术解决了这个问题,但是在应用单例模式的时候就出现了问题,因为那个方法用的是对象,也就是实例化之后的,但是单例模式是静态的变量,是无法实例化的,所以我们就采用了单例模式中用对象去访问GetInstance(),但是问题又出现了,虽然实现了单例模式,但是如果关闭的话窗体就出不来了,因为只要关闭后就相当于把资源给释放了,所以肯定就出问题了。
最后的时候师父给了我指点最后终于实现了单例模式,看看是如何实现的吧!
下面以修改密码为例来说单例模式:
主窗体代码:
<span style="font-family:KaiTi_GB2312;font-size:18px;"> private void mnsModifyPWD_Click(object sender, EventArgs e) { #region 应用单例模式,显示修改密码窗体 frmModifyPWD frmModifyPWD = frmModifyPWD.GetInstance(); frmModifyPWD.TopLevel = false; this.pnl.Controls.Add(frmModifyPWD); frmModifyPWD.BringToFront(); frmModifyPWD.Show(); #endregion }</span>
在修改密码窗体中代码:
<span style="font-family:KaiTi_GB2312;font-size:18px;"> public partial class frmModifyPWD : Form { #region 单例模式验证方法 //单例模式--饿汉式 private static frmModifyPWD instance; //创建一个静态只读的进程辅助对象 private static readonly Object SyncRoot = new Object(); //构造方法私有 public frmModifyPWD() { InitializeComponent(); } public static frmModifyPWD GetInstance() { //双重锁定 if (instance == null || instance.IsDisposed)//先判断实例是否存在,不存在,再加锁处理 { lock (SyncRoot)//加锁,只允许一个线程进入 { if (instance == null || instance.IsDisposed)//若实例不在,new一个新实例 { instance = new frmModifyPWD(); } } } return instance;//否则返回已有的实例: } #endregion }</span>
小结:虽然单例模式实现了,但是通过几个小时研究单例模式后就会发现越来越多不会的,里面有许多经典的知识需要去探索,以后会更加深入的研究单例模式。现在先理解到这里,以后有更深入的理解在继续写单例模式的博客。感谢大家宝贵的时间来看我博客。。