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、向整个系统公开实例接口,对唯一实例的受控访问。

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

  • 相关阅读:
    array and ram
    char as int
    pointer of 2d array and address
    Install SAP HANA EXPRESS on Google Cloud Platform
    Ubuntu remount hard drive
    Compile OpenSSL with Visual Studio 2019
    Install Jupyter notebook and tensorflow on Ubuntu 18.04
    Build OpenCV text(OCR) module on windows with Visual Studio 2019
    Reinstall VirtualBox 6.0 on Ubuntu 18.04
    Pitfall in std::vector<cv::Mat>
  • 原文地址:https://www.cnblogs.com/ainima/p/6331042.html
Copyright © 2011-2022 走看看