Singleton的出现,取代了C++中全局变量——这个破坏OO封装性的概念。
使用场所:控制Socket通信,写日志,简单工厂。
实现Singleton的三个要点
1.私有化构造函数
2.保存实例的静态私有变量
3.访问这个实例的公共静态方法
实现如下:
public class CSingleton
{
private static CSingleton mySingleton = null;
private CSingleton()
{
}
public static CSingleton Instance()
{
if (mySingleton == null)
mySingleton = new CSingleton();
return mySingleton;
}
public void Do()
{
//Do something
}
}
{
private static CSingleton mySingleton = null;
private CSingleton()
{
}
public static CSingleton Instance()
{
if (mySingleton == null)
mySingleton = new CSingleton();
return mySingleton;
}
public void Do()
{
//Do something
}
}
Client端使用:
CSingleton.Instance().Do();
例子1:单件窗体
点一下Menu,弹生一个弹出窗体(实例),在关闭这个新窗体之前,再次点击该Menu,不会再次出现同样的弹出窗体(实例)——Windows系统中的控制面板也是这个原理,永远只有一个。
代码如下:
private static Form1 sf;
private Form1()
{
InitializeComponent();
}
public static Form1 Instance()
{
if(sf == null)
sf = new Form1();
return sf;
}
private void Form1_Closed(object sender, System.EventArgs e)
{
this.Dispose();
sf = null;
}
private Form1()
{
InitializeComponent();
}
public static Form1 Instance()
{
if(sf == null)
sf = new Form1();
return sf;
}
private void Form1_Closed(object sender, System.EventArgs e)
{
this.Dispose();
sf = null;
}
从而,无论在哪里调用Form1,都会得到相同的实例:
Form1.Instance().Show();
——这里要确保Form1_Closed事件中清除窗体实例sf
单件是对类静态函数的一种改进。因为单件可以有子类,可以定义虚函数,具有多态性;静态函数就没有以上特性。
补注:
1.说到私有构造函数,其实还有另两种,保护型构造函数,静态构造函数,可以共存。