因为在机房重构的时候,在遇到反射+配置文件后,再一次遇到的设计模式就是单例模式,单例模式真是一种简单又有用的模式,接下来就和小编一起看看吧!
【官方定义】
单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。
【个人理解】
单例模式,就是指一个永远只能实例化一次。也就是说当你点击菜单时,子窗体只会出现一次,而不是每一次点击都会出现一个窗体。
第一种:
子窗体代码:
public partial class FormToolbox:Form
{
private static FormToolbox ftb=null; //声明一个静态类
private FormToolbox() //构造方法私有,外部代码不能直接new来实例化它
{
InitializeComponent();
}
public static FormToolbox GetInstance() //得到类实例的方法,返回值就是本类对象,也是静态的
{
if(ftb==null || ftb.IsDisposed)
{
ftb=new FormToolbox();
ftb.MdiParent=Form1.ActiveForm;
}
return ftb;
}
}
父窗体代码:
private void ToolStripMenuItemToolbox_Click(object sender,EventArgs,e)
{
FormToolbox.GetInstance().Show();
}
第二种:多线程时的单例
在多线程的程序中,多个线程同时,注意是同时间访问“Singleton”类(这里是自己编写的,不一定是这个名字,但一定是你自己定义的类名。),调用GetInstance()方法,会有可能造成创建多个实例,那如何解决呢?
这时候就可以给进程一把锁来处理,即lock语句。
class Singleton
{
private static Singleton instance;
private static readonly object syncRoot=new object(); //程序运行时创建一个静态只读的进程辅助对象
private Singleton()
{
}
public static Singleton GetInstance()
{
lock(syncRoot) //在同一时刻加了锁的那部分程序只有一个线程可以进入
{
if(instance==null)
{
instance=new Singleton();
}
}
return instance;
}
}
第三种:静态初始化
说了这么多,原来在C#与公共语言运行库中提供了一种‘静态初始化’方法,这种方法不需要开发人员显式的编写线程安全代码,即可解决多线程环境下它是不安全的问题。
public sealed class Singleton //阻止发生派生,而派生可能会增加实例
{
private static readonly Singleton instance=new Singleton(); //在第一次引用类的任何成员时创建实例。公共语言运行库负责处理变量初始化
private Singleton();
{
}
public static Singleton GetInstance()
{
return instance;
}
}
instance变量标记为readonly,这意味着只能在静态初始化期间或在类构造函数中分配变量。由于这种静态初始化的方式是在自己被加载时就将自己实例化,所以被称之为饿汉式单例类,之前的单例模式处理方式是要在第一次被引用时,才会将自己实例化,所以被称之为懒汉式单例类。