如果我们建立一个菜单,单击菜单实例化出来一个窗体,再点还会出来一个窗体,这时就需要用单例模式了。
一开始写单例的时候是在父窗体里面写的,也实现了点击多次菜单只出来一个窗体。代码如下:
- <span style="font-family:SimSun;font-size:18px;">'单例模式
- 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</span>
但是这里有二十几个窗体都要这样写,除了窗体的名字不一样之外,其他的代码还是一样的,重复性的代码太多了,于是我就想能不能把单例单独拿出来封装到一个类里面,但是单例只允许创建一个对象,于是又查了查单例模式,把对子窗体的实例化放到相应的子窗体中,让父窗体去调用子窗体的单例。
在子窗体中创建单例:由于单例具有唯一性,所以每一个子窗体中都要创建单例。
- <span style="font-family:SimSun;font-size:18px;"> '单例
- 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</span>
在父窗体中调用单例:
- <span style="font-family:SimSun;font-size:18px;">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() '本窗体获取焦点</span>
由于经历了这个过程,对单例的理解更加深刻了。发现之前的想法想歪了,也发现了单例只允许创建一个对象,因此节省内存,加快对象访问速度,对象需要被公用的适合场合使用。单例不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误不能保存彼此的状态。