单例模式之窗体应用——“唯一”

     如果我们建立一个菜单,单击菜单实例化出来一个窗体,再点还会出来一个窗体,这时就需要用单例模式了。

     一开始写单例的时候是在父窗体里面写的,也实现了点击多次菜单只出来一个窗体。代码如下:

'单例模式
    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() '本窗体获取焦点

    由于经历了这个过程,对单例的理解更加深刻了。发现之前的想法想歪了,也发现了单例只允许创建一个对象,因此节省内存,加快对象访问速度,对象需要被公用的适合场合使用。单例不适用于变化的对象,如果同一类型的对象总是要在不同的用例场景发生变化,单例就会引起数据的错误不能保存彼此的状态。

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值