也谈单件模式

前段时间,在看《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();


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

汇聚杭州外卖:外卖汇
Tag标签: 设计模式
posted @ 2007-12-09 21:59 随风逝去(叶进) 阅读(1768) 评论(6)  编辑 收藏 所属分类: G. 设计模式

  回复  引用  查看    
#1楼 2007-12-09 22:15 | Yunanw      
这个就不要放到首页了吧
  回复  引用    
#2楼 2007-12-09 22:37 | stand gof [未注册用户]
你的实现如果是单线程就无所谓了,但如果是多线程的话,会出现并发问题,对于这个没有必要延迟创建的操作,直接
public sealed class Singleton
{
private static readonly Singleton instance = new Singleton();
private Singleton(){}
public static Singleton Instance
{
get
{
return instance;
}
}
}
就可以了,而且还不会有多线程访问产生多余实例的问题。

  回复  引用  查看    
#3楼 [楼主]2007-12-09 23:14 | 随风逝去      
@stand gof
这样在一定程度上确实能够解决问题,但是,它有个问题,如果我把子窗体关闭了,它就出错了!
Instance还没有被释放(因为是readonly,所以无法释放)!
而当我关闭该窗体,再次调Form1.Instance.Show()的时候就出错了:无法访问已释放的对象。

  回复  引用  查看    
#4楼 2007-12-09 23:33 | 阿武      
用这个例子还解释单例模式确实有一些牵强, 单例模式的意图应该是自始至终都只使用同一个实例
  回复  引用  查看    
#5楼 [楼主]2007-12-09 23:37 | 随风逝去      
--引用--------------------------------------------------
阿武: 用这个例子还解释单例模式确实有一些牵强, 单例模式的意图应该是自始至终都只使用同一个实例
--------------------------------------------------------
言下之意是该实例一旦被初始化之后,就不能被释放,直到结束其职责??
  回复  引用  查看    
#6楼 2007-12-10 08:24 | 阿武      
作者对单例模式的描述是"确保一个类只有一个实例并提供一个对它的全局访问指针"。
从字面上理解确实是只应该有一个实例,而且这个实例是不能被替换的,什么时候被释放这取决的使用的编程语言,不过我觉得就算非要销毁这个实例并重新创建也未偿不可,但是至少要保护好它销毁前的状态,例如把一个大对象序列化到硬盘上,需要的时候再反序列化,保护好单一实例的状态,可以让我们在使用这个实例的时候感到更轻松.
这只是我的理解,也希望听取到其它人的看法

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-03-25 14:48 编辑过
 
 
Free Web Counter
Free Web Counter