如果我们建立一个菜单,单击菜单实例化出来一个窗体,再点还会出来一个窗体,这时就需要用单例模式了。
一开始写单例的时候是在父窗体里面写的,也实现了点击多次菜单只出来一个窗体。代码如下:
'单例模式
Public NotInheritable Class Singleton
Private Shared instance As frmQueryBalance = Nothing '定义一个静态变量,初始值为nothing
'初始化组件
Private Sub initializeComponent()
initializeComponent()
End Sub
Private Sub New()
initializeComponent()
End Sub
''' <summary>
''' 定义GetInstance函数
''' </summary>
''' <returns>返回instance为窗体类型变量</returns>
Public Shared ReadOnly Property GetInstance() As frmQueryBalance
Get
If instance Is Nothing Then '判断窗体有没有实例化,如果没有实例化,则实例化
instance = New frmQueryBalance
End If
Return instance '返回结果
End Get
End Property
End Class
但是这里有二十几个窗体都要这样写,除了窗体的名字不一样之外,其他的代码还是一样的,重复性的代码太多了,于是我就想能不能把单例单独拿出来封装到一个类里面,但是单例只允许创建一个对象,于是又查了查单例模式,把对子窗体的实例化放到相应的子窗体中,让父窗体去调用子窗体的单例。
在子窗体中创建单例:由于单例具有唯一性,所以每一个子窗体中都要创建单例。
'单例
Private frmCheckBalance() '定义构造函数 '声明一个子窗体类型的静态变量
Private Shared instance As frmCheckBalance
'通过静态方法创建子窗体
Public Shared Function CreateFrom() As frmCheckBalance
If instance Is Nothing OrElse instance.IsDisposed = True Then '判断窗体是否实例化或者是窗体是否释放
instance = New frmCheckBalance '窗体实例化
End If
Return instance '返回实例化结果
End Function
在父窗体中调用单例:
Dim frm As New frmCheckBalance '实例化窗体
frm = frmCheckBalance.CreateFrom() '给frm赋值,调用frmQueryBalance的方法
frm.MdiParent = Me '定义本窗体为父窗体
frm.TopLevel = False '把窗体frm 放置到现在窗体上的panel
frm.Visible = True '窗体可见
Me.Panel1.Controls.Add(frm) '主界面上的panel上面显示窗体
frm.BringToFront() '加载多个窗体
frm.Show() '显示窗体
frm.Focus() '本窗体获取焦点
由于经历了这个过程,对单例的理解更加深刻了。发现之前的想法想歪了,也发现了单例只允许创建一个对象,因此节省内存,加快对象访问速度,对象需要被公用的适合场合使用。单例不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误不能保存彼此的状态。