单例模式以及使用在winform界面开发上的实例

1.什么是单例模式

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

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

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

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

       如果一个方法和他所在类的实例对象无关,那么它就应该是静态的,反之他就应该是非静态的。如果我们确实应该使用非静态的方法,但是在创建类时又确实只需要维护一份实例时,就需要用单例模式了。

比如说我们在系统运行时候,就需要加载一些配置和属性,这些配置和属性是一定存在了,又是公共的,同时需要在整个生命周期中都存在,所以只需要一份就行,这个时候如果需要我再需要的时候new一个,再给他分配值,显然是浪费内存并且再赋值没什么意义,所以这个时候我们就需要单例模式或静态方法去维持一份且仅这一份拷贝,但此时这些配置和属性又是通过面向对象的编码方式得到的,我们就应该使用单例模式,或者不是面向对象的,但他本身的属性应该是面对对象的,我们使用静态方法虽然能同样解决问题,但是最好的解决方案也应该是使用单例模式。


从功能上讲:单例模式可以控制单例数量;可以进行有意义的派生;对实例的创建有更自由的控制;

单例模式使用在界面开发中:

在主窗体界面中:

 public partial class MainFunctionZone : Form, IMainFunctionForm
    {
        #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
        public static MainFunctionZone CreateInstance()
        {
            _instance = new MainFunctionZone();
            return _instance;
        }

        public Control ActivingControl
        {
            set
            {
                this.panChange.Controls.Clear();
                this.panChange.Controls.Add(value);
            }
            
        }

        //认证成功后自动跳转的委托
        public void SwitchToNewInstance<TControl>() where TControl : Control, new()
        {
            this.Invoke(new Action(() =>
            {
                this.ActivingControl = new TControl();
            }));
        }

        public void BackToLogin()
        {
            this.Invoke(new Worker(() =>
            {
                this.FormClosed -= ApplicationController.ExitEvent;
                this.Close();
                (new Login()).Show();
            }));
        }

 

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

比如:

  public interface IMainFunctionForm
    {
        System.Windows.Forms.Control ActivingControl { set; }//在其他类中调用时,只有写入属性(set)。
 
        void BackToLogin();
 
        void SwitchToNewInstance<TControl>()
            where TControl : Control, new();
    }

 

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

MainFunctionZone.Instance.BackToLogin();
MainFunctionZone.Instance.ActivingControl
= new CtlIDCardVerifyResult();
MainFunctionZone.Instance.SwitchToNewInstance
<CtlVerifyResult>();
posted @ 2013-08-22 10:11  Joe-xin  阅读(897)  评论(0编辑  收藏  举报