【设计模式】之单例模式

        因为在机房重构的时候,在遇到反射+配置文件后,再一次遇到的设计模式就是单例模式,单例模式真是一种简单又有用的模式,接下来就和小编一起看看吧!

官方定义

单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。

【个人理解】

        单例模式,就是指一个永远只能实例化一次。也就是说当你点击菜单时,子窗体只会出现一次,而不是每一次点击都会出现一个窗体。

第一种:

子窗体代码:

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,这意味着只能在静态初始化期间或在类构造函数中分配变量。由于这种静态初始化的方式是在自己被加载时就将自己实例化,所以被称之为饿汉式单例类,之前的单例模式处理方式是要在第一次被引用时,才会将自己实例化,所以被称之为懒汉式单例类。




评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值