【转】在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/

 

时间: 2024-09-29 09:46:12

【转】在WinForm中理解单例模式的相关文章

浅谈.NET下的多线程和并行计算(八)Winform中多线程编程基础 上

首先我们创建一个Winform的应用程序,在上面添加一个多行文本框和一个按钮控件,按钮的事件如下 : Thread.Sleep(1000); StringBuilder sb = new StringBuilder(); for (int i = 0; i < 10000; i++) sb.Append("test"); string s = sb.ToString(); textBox1.Text = s; 首先我们可以把这个操作理解为一个非常耗时的操作,它至少占用1秒的时间.

WinForm中如何实现类似于百度搜索的功能。

问题描述 winform中如何实现类似于百度搜索,只输入拼音首字母或是全拼,自动在下拉列表中列出与字母对应的选择信息.注意:是拼音首字母或是全拼,而不是中文字. 解决方案 解决方案二:曾经做过一个简单的搜索.实现下拉的办法是一个Combobox在底下一个Textbox在上面Combobox露出下拉三角部分.TextBox变值时事件实现下拉框弹出搜索到的内容解决方案三:障眼法解决方案四:不知道我理解的是否正确,通过输入的字符自动匹配下拉列表中的对应的选项,是这样吧?如果是这样的话,你可以设置com

如何在winform中打开pdf文档的超链接?

问题描述 如何在winform中打开pdf文档的超链接? 40C 环境:windows8+vs2010+winform+adobe padf reader pdf文档中有一些超链接,单独打开时,超链接正常访问. 在pdf文档在 winform中打开后,超链接不能正常访问(没有反应) 有无解决方案? 解决方案 没有任何问题,不知道你是怎么写的 将pdf默认打开方式设为adobe padf reader试试 解决方案二: 看来你没有理解我的问题.------超链接是在pdf文档里面,而不是超链接指向

Objective-C中的单例模式

 ​    ​单例模式算是设计模式中比较简单的一种吧,设计模式不是只针对某种编程语言,在C++, Java, PHP等其他OOP语言也有设计模式,笔者初接触设计模式是通过<漫谈设计模式>了解的.这本书中是用java写的,个人感觉拜读完这本书以后虽然有不理解的地方但还是收获蛮大的.上面提到依赖注入,控制翻转的时候,没大看懂,当学习到Strut,Spring, Hibernate的东西的时候才略懂略懂.不过在23种设计模式里面单例模式还是算比较好理解的, 那么在OC中又是怎么来表示单例模式的呢?下

.Net WInform开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用_C#教程

中午没事,把去年刚毕业那会画的几张图翻出来了,大概介绍Winform应用程序运行的过程,以及TCP协议在Winform中的应用.如果有Windows消息机制等基础,很好理解这两张图. (1)Winform应用程序运行结构图 开发笔记(二)Winform程序运行结构图及TCP协议在Winform中的应用_C#教程-tcp ip协议 层结构图"> (2)TCP通讯协议在Winform程序中的应用示意图 熟悉整个程序的来龙去脉,编程的时候就会很轻松,不会云里雾里. 另附公司招聘面试题一份,用了几

WinForm中类似WebForm中的CheckBoxList控件

web|控件 前些天,在.Net技术的论坛里面看到了有个帖子,我好像记得是怎么实现WinForm中类似WebForm中的CheckBoxList控件,我简单的实现了那样的一个控件 首先,你得建立一个控件项目,假如说是: 接着,你就添加一个类:CheckBoxCollection,它是个CheckBox的集合类 具体的代码如下 CheckBoxCollection.cs using System;using System.Collections;using System.Windows.Forms

如何在C#的WinForm中制作饼状图和柱状图

饼状图|柱状图 当我们的软件需要各种饼状图和柱状图来表示数据时,我们或许会想到用Offices中的图形控件或是第三方控件,但现在的第三方控件大都需要注册,有些免费的控件会有开发商的标记等.而对于使用Offices的图形控件来说,并不能在程序中得于很好控制,其使用的简易程度也较低,所以在这我给出在C#中使用GDI+实现饼状图和柱状图跟数据库联接显示数据的方法.  using System;  using System.IO;//用于文件存取  using System.Data;//用于数据访问 

WinForm中的特殊窗体效果:渐变窗口和信息提示窗口

在WinForm中偶尔会遇到某些特殊效果:比如某个窗口刚开始的时候是完全透明的,随着时间的变化 ,窗体逐渐不透明,直至完全不透明.这是本文要探讨的窗体效果之一:渐变窗体. 还有一种窗 体效果:有些软件在某个特定的时间会显示一个提示窗体,这个窗体不是直接显示的,而是慢慢从窗口 的最下方向上移动,直至窗体完全显示就不再移动.当我们点击"确定"按钮之后,窗体由 从屏幕上逐渐下移,直至完全从屏幕上完全不显示.这也是本文讨论的窗体效果之一:移动提示信息窗 口. (一)渐变窗体 每个窗体都有一个O

浅谈.NET下的多线程和并行计算(九)Winform中多线程编程基础 下

在之前的文章中我们介绍过两种Timer和BackgroundWorker组件,在上文中我们提到过,强烈建议在UI 线程上操作控件,否则很容易产生人品问题.可以想到,上次介绍的两个Timer基于ThreadPool,回调方 法运行于不同于UI线程的新线程上,在这个方法中操作控件需要进行 Invoke或BeginInvoke.其实,还有 第三种System.Windows.Forms.Timer,它可以让回调事件在UI线程上执行,我们来做一个实验比较一下 System.Windows.Forms.T