单例模式

由于最近工作需要用到单实例模式,虽然以前对单实例模式有些了解,但却没有实际应用过,看了也就忘记了。再次熟悉一下:

有时候,我们需要在程序运行整个过程中,为了效率问题或者用户体验,要求只产生对象的一个实例,这时候我们就需要用到单实例模式。

例如:我们想在弹出对话框窗口时,不论用户触发多少次事件,当窗口存在时,只弹出一次。

1:

将弹出窗口Form1作为全局变量声明:Form1 frm1;

在触发弹出窗口事件时判断Form1是否实例化,如果没有,实例化窗口弹出:

if(frm1==null)

{

  frm1=new Form();

  frm1.show();

}

但这时还是有问题,当我们关闭窗口后,再点击却不能在弹出窗口,因为在关闭窗口时,Form实例并没有为null而只是disposed。

2:

if(frm1==null||frm1.isdisposed)

{

  frm1=new Form();

  frm1.show();

}

3:为了提高代码的重用性,将方法写成单独一个方法。

public void OpenForm()

{  

if(frm1==null||frm1.isdisposed)

{

  frm1=new Form();

  frm1.show();

}

}

4:为了体现代码的封装性,我们将对窗口的实例化写进需要弹出的窗体中。

private static Form1 frm1=null;

private Form1()

{

  InitializeComponent();

}

//构造方法私有,外部代码不能通过new来实例化。

public static Form1 GetInstance()

{

if(frm1==null||frm1.isdisposed)

{

  frm1=new Form();

}

return frm1;

}

到此,我们再总结一下:什么是单例模式?就是一个类只有一个实例,并提供一个访问它的全局访问点。

如何才能是一个全局变量被访问并且防止被实例化为多个对象?最好的方法是让类负责保存它的唯一实例,这个类可以保证没有其他的类可以创建,并且提供一个公共方法访问该实例。

posted @ 2012-06-11 23:49  iskyoole  阅读(335)  评论(0编辑  收藏  举报