也谈单件模式

前段时间,在看《C#设计模式》(还没看完)。大致了解了下单件模式。
我就先“摘录”下书上是怎么说单件模式的:
单件模式(SINGLETON):要求一个类仅有一个实例,与此同时,提供一个全局的访问点。这意味着:一个特定的对象承担了某项职责,而其他对象必须依赖这项职责。
一般情况下,对一个单件对象进行惰性初始化,即仅当第一次使用这个对象的时候才对这个对象进行初始化。在一个单独的对象实例中,集中了这个对象实例所属类的所有权力。

以上是《C#设计模式》对单件模式的描述。
其实,我在看完书之后,一直都不大懂是什么意思,单件模式可以做什么用。只是,隐隐地知道,它的实例只能有一个。

最近,我在做的一个项目中要有用到Mdi子窗体,而且只能实例化(打开)一个。
我原来的做法是检查所有已经存在的mdi子窗体,如果它们中有需要的,那么把这个窗体BringToFront;如果没有,即还未被实例化,那么就初始化该窗体。

后来,无意间在微软的新闻组中看到有人解答: mdi程序中如何让子窗体不重复打开的问题。我就看了下,发现他就是用单件模式来“锁定”mdi子窗体只能被实例化一次;如果该实例已经存在,就不做处理;如果不存在,就new一个。
我突然豁然开朗:原来单件模式的应用可以这样地自然;原来这个就是单件模式。(当然啦,单件模式的应用肯定是要多得多,有用得多;但是,就从我这个菜鸟的角度来看,这个就是我目前要用到的单件模式)。
我就在其基础上稍作更改,应用到了我的项目中。  呵呵!

以下是他的问答,加代码:
这个问题我来回答:不一定是最适合的方法,只是方法的一种。


我是使用单例模式
窗体类是这样写的

    public partial class Form1 : Form
    {

        
#region 构造方法
        
/// <summary>
        
/// Form1构造方法
        
/// </summary>
        private Form1()
        {
        }
        
#endregion

        
#region Form1单例模式
        
/// <summary>
        
/// Form1的单例实例
        
/// </summary>
        private volatile static Form1 instance = null;

        
/// <summary>
        
/// 本类型的单例属性
        
/// </summary>
        public static Form1 Instance
        {
            
get
            {
                
if (instance == null||instance.IsDisposed)
                {
                    instance 
= new Form1();
                }
                
return instance;
            }
        }
        
#endregion
    }


调用
Form1.Instance.MdiParent = MdiForm;
Form1.Instance.Show();


发现,其实感觉很高深的东西,实际上都有它很简单的应用。不要认为设计模式是什么高深的东西,其实就那么回事(不知道有没有说错,反正这就是我这次的体会)!

posted @ 2007-12-09 21:59  随风逝去(叶进)  阅读(3427)  评论(8编辑  收藏  举报
Free Web Counter
Free Web Counter