单例模式主要处理两个问题: 全局访问与实例化控制
单例模式采用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
版权声明:本文为博主原创文章,转载请附上博文链接!


少有人走的路


















