单例模式主要处理两个问题: 全局访问与实例化控制
单例模式采用private构造函数,让该类不能外部new, 并且提供static方法 GetInstance()方法返回唯一实例.
采用lock机制可以避免在多线程环境下可能产品多个实例.
下面是勇哥编写的一个例子:
工具箱1Form和代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Singleton { public partial class ToolsWin : Form { private static readonly object syncRoot = new object(); private static ToolsWin ftb = null; private ToolsWin() { InitializeComponent(); } public static ToolsWin GetInstance() { if (ftb == null || ftb.IsDisposed) { lock (syncRoot) { if (ftb == null || ftb.IsDisposed) { ftb = new ToolsWin(); ftb.MdiParent = MainForm.ActiveForm; } } } return ftb; } } }
工具箱2Form及代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Singleton { public sealed partial class ToolsWin2 : Form { private static readonly ToolsWin2 instance = new ToolsWin2(); private ToolsWin2() { InitializeComponent(); } public static ToolsWin2 GetInstance() { instance.MdiParent = MainForm.ActiveForm; return instance; } } }
主窗口及代码
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Singleton { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void toolStripLabel1_Click(object sender, EventArgs e) { ToolsWin.GetInstance().Show(); ToolsWin s1 = ToolsWin.GetInstance(); ToolsWin s2 = ToolsWin.GetInstance(); if (s1 == s2) MessageBox.Show("两个对象是相同的实例!"); } private void toolStripLabel2_Click(object sender, EventArgs e) { /* C#的静态初始化方法,不用开发人显式地编写线程安全代码,即可以解决多线程环境下它是不安全的问题. 但是,安关闭这个工具箱2后,instace被dispose(),然后再也无法被new了! 怎么搞? 不知道. */ ToolsWin2.GetInstance().Show(); } } }
因为单例模式的作用,程序运行后你只能点击出工具箱和工具箱2一次。
实际应用的时候,一个类可以不提供构造函数,也可防止外部new这个类。
并且可以用静态属性方式返回这个例的唯一实例,而不通过方法返回。
这样就可以简化成下面这个样子:
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!
本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:


