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

简介: 单例模式(Singleton Model)存在的必要性:  为什么需要单例模式呢? 在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例,才 能确保它们的逻辑正确性、以及良好的效率。

单例模式(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/

 

目录
相关文章
|
7月前
单例模式设计(一)
饿汉模式 由名字我们就可以知道 &quot;饿汉&quot; 嘛,就比较急切,在类加载的时候就创建实例: 1. 写一个类,在本类中构造实例,用static修饰,直接创建出来(提供一个现有的实例) 2. 在本类中写一个方法获取到上面的实例 3. 将这个类的构造方法设置为私有的,让外部不能 new 这个对象
38 0
|
5月前
|
设计模式 存储 Rust
二十三种设计模式:单例模式
在这个代码中,我们定义了一个名为Singleton的类,其中包含一个私有的静态指针instance,用于存储单例对象的唯一实例。构造函数被私有化,这意味着外部无法直接实例化Singleton类的对象。我们通过getInstance()方法来获取Singleton类的唯一实例,如果instance指针为空,则创建一个新的Singleton对象并将其赋值给instance指针。最后,我们定义了一个doSomething()方法,用于执行单例类的具体操作。
31 0
|
6月前
|
设计模式 数据库连接 数据库
QT 使用单例模式
QT 使用单例模式
|
7月前
|
安全
单例模式设计(二)
根据上面的 "懒汉模式" 和 "饿汉模式"。我们可以知道,懒汉模式,它只是负责读取,没有修改。而 " 饿汉模式 " 是既读取,也进行修改。所以来说, "懒汉模式" 是线程安全的, "饿汉模式" 是线程不安全的。
36 0
|
9月前
|
设计模式
设计模式-单例模式(程序中的计划生育)
设计模式-单例模式(程序中的计划生育)
33 0
|
9月前
|
设计模式 关系型数据库 MySQL
你知道独生子女用编程怎么表示吗?单例模式了解一下
你知道独生子女用编程怎么表示吗?单例模式了解一下
56 1
你知道独生子女用编程怎么表示吗?单例模式了解一下
|
设计模式 安全 Java
23种设计模式-创建模式-单例模式(三)
23种设计模式-创建模式-单例模式(三)
|
设计模式 安全 C++
代码操作中经常使用到设计模式之单例模式
代码操作中经常使用到设计模式之单例模式
130 0
代码操作中经常使用到设计模式之单例模式
|
设计模式 安全 Java
Java面向对象(16)--单例(Singleton)设计模式
Java面向对象(16)--单例(Singleton)设计模式
83 4
|
设计模式 编译器 计算机视觉
Qt实用技巧:设计模式之单例模式,唯一实例类通用模板
Qt实用技巧:设计模式之单例模式,唯一实例类通用模板