单例模式_.NET_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > .NET > 单例模式

单例模式

 2013/8/22 10:58:02  Joe_xin  博客园  我要评论(0)
  • 摘要:1.什么是单例模式单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。2.单例模式应用场景举例NET中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务
  • 标签:模式 单例模式
1.什么是单例模式


  



单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。 通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。                                                               

2.单例模式应用场景举例


 



NET中单例模式定义:“一个类有且仅有一个实例,并且自行实例化向整个系统提供。”


对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务;如在Windows中就只能打开一个任务管理器。如果不使用机制对窗口对象进行唯一化,将弹出多个窗口,如果这些窗口显示的内容完全一致,则是重复对象,浪费内存资源;如果这些窗口显示的内容不一致,则意味着在某一瞬间系统有多个状态,与实际不符,也会给用户带来误解,不知道哪一个才是真实的状态。因此有时确保系统中某个对象的唯一性即一个类只能有一个实例非常重要。








如何保证一个类只有一个实例并且这个实例易于被访问呢?定义一个全局变量可以确保对象随时都可以被访问,但不能防止我们实例化多个对象。一个更好的解决办法是让类自身负责保存它的唯一实例。这个类可以保证没有其他实例被创建,并且它可以提供一个访问该实例的方法。这就是单例模式的模式动机。

   从具体实现角度来说,就是以下三点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,
三是该类提供了一个静态的共有的函数用于创建或获取它本身的静态私有对象。

在一个类MainFunctionZone中:
#region
###用于实现单例模式         /// <summary>         /// 实例对象         /// </summary>         public static IMainFunctionForm Instance         {             get             {                 lock (paklock)                 {                     if (_instance == null) _instance = new MainFunctionZone();                     return _instance;                 }             }         }         private static MainFunctionZone _instance;         private static object paklock = new object();         private MainFunctionZone()         {             InitializeComponent();         }         #endregion

例如:以上内容创建在一个类MainFunctionForm中,而IMainFunctionFrom是该类继承的一个接口,接口会定义一些方法,那么这个类将实现接口中的所有方法,当然,这个类可能还有其他方法,这里用IMainFunctionForm当做这个单例模式Instance的类型,就是在其他类中只能单例调用IMainFunctionForm这里面定义的方法

比如:

  public interface IMainFunctionForm
    {
        System.Windows.Forms.Control ActivingControl { set; }//可以在其他类写进去一些东西!
 
        void BackToLogin();
 
        void SwitchToNewInstance<TControl>()
            where TControl : Controlnew();
    }

接口中定义了这三个方法,那么在其他类中可以这样用:(记住一定不能用new的方法,单例模式)

MainFunctionZone.Instance.BackToLogin();
发表评论
用户名: 匿名