定义:保证一个类仅有一个实例并提供一个访问它的全局访问点。
解释:通常我们可以让一个全局变量使得一个对象被访问,但它不能防止你实例化多个对象。一个最好的办法就是,让类自身保存它的唯一实例。这个类可以保证没有其他实例可以被创建,并且它可以提供一个访问实例的方法。
特点:一是单例模式的类只提供私有的构造函数,二是类定义中含有一个该类的静态私有对象,三是该类提供了一个静态的公有的函数用于创建或获取它本身的静态私有对象。
优点:单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。因为类控制了实例化过程,所以类可以灵活更改实例化过程。
结构图:
机房重构中,当用到MDI窗体时,需要用到单例模式来防止多次实例化子窗体。
当你在frmMain中充值Click事件中,写下面的代码:
Dim NewMDIRecharge As New frmRecharge '实例化一个新的充值的窗体 NewMDIRecharge.MdiParent = Me '定义父窗体为frmMain NewMDIRecharge.Show() '显示刚定义的窗体
当你多次点击充值时,你会出现这种情况:
这时,你需要单例模式来解决这个问题。
现在在frmRecharge窗体中加入以下代码:
Private Shared Recharge As frmRecharge = Nothing '声明一个共享的类变量Recharge '该frmRecharge类的构造函数 Private Sub New() ' 此调用是设计器所必需的。 InitializeComponent() ' 在 InitializeComponent() 调用之后添加任何初始化。 End Sub '写一个公有的方法来检验这个类是否初始化以及被释放过 Public Shared Function GetInstance() As frmRecharge If Recharge Is Nothing OrElse Recharge.IsDisposed Then Recharge = New frm Recharge Recharge.MdiParent = frmMain.ActiveForm End If Return Recharge '把新的窗体返回出来 End Function
然后回到frmMain中,重新写入下面代码:
Dim NewMDIRecharge As New frmRecharge '实例化一个新的充值的窗体 NewMDIRecharge.MdiParent = Me '定义父窗体为frmMain 'NewMDIModifyPassword.Show() '显示刚定义的窗体 frmRecharge.GetInstance.Show()
显示的结果:
当你现在在多次点击充值时,他就不会再出现多次实例化窗体的情况了。