因为在机房重构的时候,在遇到反射+配置文件后,再一次遇到的设计模式就是单例模式,单例模式真是一种简单又有用的模式,接下来就和小编一起看看吧!
【官方定义】
单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。
【个人理解】
单例模式,就是指一个永远只能实例化一次。也就是说当你点击菜单时,子窗体只会出现一次,而不是每一次点击都会出现一个窗体。
第一种:
子窗体代码:
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,这意味着只能在静态初始化期间或在类构造函数中分配变量。由于这种静态初始化的方式是在自己被加载时就将自己实例化,所以被称之为饿汉式单例类,之前的单例模式处理方式是要在第一次被引用时,才会将自己实例化,所以被称之为懒汉式单例类。