天天看点

【设计模式】单例模式实践应用

背景:

   在机房合作之前我们就商量好了都用哪些设计模式,而单例模式也是我们最先想到的,之前是用的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>
           

    之前我们用外部的函数解决窗体的层叠顺序的问题,现在使用C#中内部的方法来解决这个问题,在C#中只有panel是容器,而我们之前用到的PictureBox在这个里面已经不是容器了, 利用这用方法就能完美的实现单例模式。理论容易实战还是差一截啊。

小结:虽然单例模式实现了,但是通过几个小时研究单例模式后就会发现越来越多不会的,里面有许多经典的知识需要去探索,以后会更加深入的研究单例模式。现在先理解到这里,以后有更深入的理解在继续写单例模式的博客。感谢大家宝贵的时间来看我博客。。

继续阅读