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

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

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

  1. <span style="font-family:SimSun;font-size:18px;">'单例模式  
  2.     Public NotInheritable Class Singleton  
  3.         Private Shared instance As frmQueryBalance = Nothing '定义一个静态变量,初始值为nothing  
  4.         '初始化组件  
  5.         Private Sub initializeComponent()  
  6.             initializeComponent()  
  7.         End Sub  
  8.         Private Sub New()  
  9.             initializeComponent()  
  10.         End Sub  
  11.         ''' <summary>  
  12.         ''' 定义GetInstance函数  
  13.         ''' </summary>  
  14.         ''' <returns>返回instance为窗体类型变量</returns>  
  15.         Public Shared ReadOnly Property GetInstance() As frmQueryBalance  
  16.             Get  
  17.   
  18.                 If instance Is Nothing Then '判断窗体有没有实例化,如果没有实例化,则实例化  
  19.   
  20.                     instance = New frmQueryBalance  
  21.   
  22.                 End If  
  23.                 Return instance '返回结果  
  24.             End Get  
  25.   
  26.         End Property  
  27.     End Class</span>  

    但是这里有二十几个窗体都要这样写,除了窗体的名字不一样之外,其他的代码还是一样的,重复性的代码太多了,于是我就想能不能把单例单独拿出来封装到一个类里面,但是单例只允许创建一个对象,于是又查了查单例模式,把对子窗体的实例化放到相应的子窗体中,让父窗体去调用子窗体的单例。


在子窗体中创建单例:由于单例具有唯一性,所以每一个子窗体中都要创建单例。

  1. <span style="font-family:SimSun;font-size:18px;"'单例  
  2.     Private frmCheckBalance() '定义构造函数    '声明一个子窗体类型的静态变量  
  3.     Private Shared instance As frmCheckBalance  
  4.     '通过静态方法创建子窗体  
  5.     Public Shared Function CreateFrom() As frmCheckBalance  
  6.         If instance Is Nothing OrElse instance.IsDisposed = True Then '判断窗体是否实例化或者是窗体是否释放  
  7.   
  8.             instance = New frmCheckBalance '窗体实例化  
  9.   
  10.         End If  
  11.         Return instance '返回实例化结果  
  12.     End Function</span>  


在父窗体中调用单例:

  1. <span style="font-family:SimSun;font-size:18px;">Dim frm As New frmCheckBalance  '实例化窗体         
  2.         frm = frmCheckBalance.CreateFrom() '给frm赋值,调用frmQueryBalance的方法  
  3.         frm.MdiParent = Me '定义本窗体为父窗体  
  4.         frm.TopLevel = False '把窗体frm 放置到现在窗体上的panel   
  5.         frm.Visible = True '窗体可见  
  6.         Me.Panel1.Controls.Add(frm) '主界面上的panel上面显示窗体  
  7.         frm.BringToFront() '加载多个窗体  
  8.         frm.Show() '显示窗体  
  9.         frm.Focus() '本窗体获取焦点</span>  

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值