• 【转】在WinForm中理解单例模式


    单例模式(Singleton Model)存在的必要性:
      为什么需要单例模式呢? 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才

    能确保它们的逻辑正确性、以及良好的效率。所以,单例模式应运而生。这样就保证了一个类仅有一个实例,并

    提供一个该实例的全局访问点。

    什么是单例模式?
      作为对象的创建模式,单例模式确保某一个类只有一个实例,而且自行实例化(即私有构造)并向整个系统提供这

    个实例,此为单例模式。而这个类就称为单例类。

    单例模式的特点:
      1.单例模式只能有一个实例;
      2.单例模式必须有一个私有构造函数;
      3.单例模式必须提供一个全局访问点,供整个系统使用。

    注意:
      1.单例模式中的构造函数可以为protected类型以允许子类派生,但绝对不可以是public;
      2.单例模式一般不要求支持ICloneable接口,单例模式一般不要支持序列化,因为这都会导致对象实例,与单例

    模式的初衷相违背;
      3.单例模式只考虑到了对象创建的管理,没有考虑对象销毁的管理。对于支持垃圾回收的平台来讲,我们一般没

    有必要对其销毁进行特殊的管理。
      4.不能应对多线程环境:在多线程环境下,使用单例模式仍然有可能得到单例类的多个实例对象。

    单例模式的典型案例(C#)
      WinForm中的父窗体(MDIParent)与子窗体的关系就应该是一个典型的单例模式。
      首先,在Visual Studio中创建一个Windows应用程序,创建两个窗体From1和Form2,将Form1设为父窗体,Form2

    设为子窗体;
      示例代码:
    private void Form1_Load(object sender, EventArgs e)       
    {      
         this.IsMdiContainer = true;   //窗体加载时,将Form1设为父窗体         
         this.WindowState = FormWindowState.Maximized;    //窗体加载时,窗体为最大化     
    }

      其次,在Form1中添加一个MenuStrip控件,将其文本改为'新建',编写其单击事件;
      示例代码:
    private void msNew_Click(object sender, EventArgs e)
    {
        Form2 frm = new Form2();  //单击'新建'菜单时,创建子窗体Form2的对象
        frm.MdiParent = this;  //指定父窗体
        f.Show();  //显示子窗体
    }
      完成之后,点击'新建'菜单会创建一个子窗体,若连续点击,则会创建多个子窗体,这显然不符合我们的要求。
    可不可以当点击'新建'菜单时,只创建一个子窗体呢? 当然,用单例模式可以实现。
    现在就将刚才的代码改动一下,
      首先,创建单例模式类,即修改Form2.cs,将Form2的构造函数私有化,创建静态私有的成员字段,再创建一个

    全局访问点,即一个公共的静态的方法;修改后的Form2.cs的代码为:
      示例代码:Form2.cs
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace SingletonDemo
    {
        public partial class Form2 : Form
        {
            /// <summary>
            /// 私有的构造方法
            /// </summary>
            private Form2()
            {
                InitializeComponent();
            }

            /// <summary>
            /// 静态私有的成员字段
            /// </summary>
            private static Form2 form2 = null;

            /// <summary>
            /// 全局访问点,公共的访问方法
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            public static Form2 CreateForm()
            {
                if (form2 == null || form2.IsDisposed)
                {
                    form2 = new Form2();  //创建一个子窗体
                    form2.MdiParent = ActiveForm;  //指定父窗体,为当前激活的窗体;
                }
                return form2;
            }
        }

    }

      之后,在Form1的'新建'菜单的单击事件中调用Form2中单例模式的全局访问点,即可实现即使连续点击'新建'菜

    单,也只创建一个子窗体,也就实现了单例模式。

    原文:http://renhappy20066.blog.163.com/blog/static/1120807862010220103122415/

  • 相关阅读:
    LeetCode 350. Intersection of Two Arrays II (两个数组的相交之二)
    LeetCode 349. Intersection of Two Arrays (两个数组的相交)
    LeetCode 290. Word Pattern (词语模式)
    LeetCode 266. Palindrome Permutation (回文排列)$
    34.Search for a Range
    spark连接mongodb
    NLPIR中文分词器的使用
    scala和maven整合实践
    Spark中的键值对操作-scala
    301.Remove Invalid Parentheses
  • 原文地址:https://www.cnblogs.com/SummerRain/p/2607494.html
Copyright © 2020-2023  润新知