zoukankan      html  css  js  c++  java
  • 深入浅出单例模式

             从现在看来,学习设计模式是很久之前的事了,刚开始的时候对设计模式的理解真的很浅,基本就是处于表面,不知道怎么在系统中应用。现在小组开始合作做系统了,在系统中使用设计模式,能更好的实现代码复用,让自己的系统更好的做到低耦合高内内,同时对于后期的扩展和维护也更加的方便。

            这篇博客我们主要重新回顾和认识单例模式:

     

    单例模式(Singleton):

     

    保证一个类仅有一个实例,并提供一个访问它的全局访问点。

     

    结构图:


     

    C#语言的实现代码:

     

    <span style="font-family:Microsoft YaHei; font-size:18px">class Singleton
        {
            //定义一个私有变量,保存创建的实例
            private static Singleton instance;
            //私有的构造方法,外界不能利用New创建此类实例
            private Singleton () 
            {
            }
            //提供一个静态方法,用于返回唯一的Singleton实例
            public static Singleton GetInstance()
            {
                //如果instance为null,表明还没有创建Singleton对象
                //如果instance不为null,则表明已经创建了Singleton对象,将不会执行该方法
                if (instance == null) 
                {
                    //创建一个Singleton对象,并将缓存起来
                    instance = new Singleton();
                }
                return instance;
            }
        }</span>
    <span style="font-family:Microsoft YaHei; font-size:18px"> //客户端代码
            static void Main(string[] args)
            {
                //创建Singleton对象不能通过构造器,只能通过getInstance方法
                Singleton s1 = Singleton.GetInstance();
                Singleton s2 = Singleton.GetInstance();
    
                if (s1 == s2) //比较两次实例化对象的结果是实例相同
                {
                    Console.WriteLine("两个对象是相同的实例。");
                }
                Console.Read();
            }</span>

     

    下面我们使用vb.net语言,实现单例模式

     

           首先建立一个Windows应用程序,默认的窗体为Form1,设置它的ISMdiContainer属性为true,表示它是一个多文档界面MdI子窗体的容器。然后建立button按钮,我们再创建一个窗体ChildForm,单击就创建一个子窗体。

    在没有使用单例模式的时候,子窗体会显示多个(如图1),但这并不是我们想要的结果,我们想要图2中显示的,无论单击多少次,只显示一个子窗体,此时我们就用到了单例模式。

    图1

                                                           

                                                                                                              图2

                                                          

           下面我们按照我们上面的代码照葫芦画瓢就好。 

     

     

    Public Class ChildForm
        ' 定义一个私有变量,保存创建的实例
        Private Shared instance As ChildForm
        '私有的构造方法,外界不能利用New创建此类实例(我们没有写),所有类都有构造方法,不编码则系统默认生成空的构造方法
        ' 提供一个静态方法,用于返回唯一的Singleton实例
        Public Shared Function CreateForm() As ChildForm
            '如果instance不存在或关闭时, 表明还没有创建ChildForm对象
            '如果instance存在时, 则表明已经创建了ChildForm对象, 将不会执行该方法
            If instance Is Nothing OrElse instance.IsDisposed = True Then
                '创建一个ChildForm对象,并将缓存起来
                instance = New ChildForm
                instance.MdiParent = Form.ActiveForm
            End If
            Return instance '返回实例化结果
        End Function
    End Class
    '客户端代码
    Public Class Form
        Private Sub btnShow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnShow.Click
            '单击显示子窗体
            ChildForm.CreateForm().Show()
        End Sub
    End Class

    单例模式的优点和缺点:

     

    优点:

           1、保证该类只有唯一的实例。

           2、该类自身负责保存实例,并保证没有其他实例可以被创建。

           3、向整个系统公开实例接口,对唯一实例的受控访问。

           所有的设计模式都是一样的,既有优点也有缺点,我们利用它的优点的同时,不能忽略他的缺点,在多线程的程序中,多个线程同时访问,会造成创建多个实例,存在不安全问题。

  • 相关阅读:
    Are You Safer With Firefox?(zz)
    IIS+PHP下调用WebService初试
    垃圾链接和网络欺骗
    微软即将发布64位XP和Win2003 SP1(zz)
    今日个人大事记:)
    GT4 Web Service编译和发布初探
    纪念一下QQ等级和在线时长
    今天安装GT3.9.5碰到的问题
    判断32位整数二进制中1的个数
    Windows 2003 SP1新体验
  • 原文地址:https://www.cnblogs.com/ainima/p/6331042.html
Copyright © 2011-2022 走看看