机房重构---单例模式应用

前言:


说到单例模式,我们可能会想到饿汉和懒汉这两种方式,下面就让我们来重温一下这两种单例模式吧。


内容:


一、单例模式是什么?


单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。


饿汉式单例类懒汉式单例类
初始化时(类加载的时候)就实例化。类被加载的时候立马占用CPU内存,不管你用不用到他,反正先占内存了。
(饿汉:特别饿,需要立马进食)
第一次引用时才实例化。或者说:只有用到的时候才实例化 
(懒汉:被安排了工作要做,能拖就拖,除非到最后紧要关头,需要交了,才干活)                               

二、为什么要用?


根据定义就可以知道,是为了保证一个类只有一个实例。

例如:单击菜单栏下面的子菜单只会出现一个窗体,而不会出现重复的窗体。

工具箱。每个软件上面基本都有吧,无论我们通过哪种方式打开工具箱,最后的结果只有一个工具箱,这就用到了单例模式。


三、两种单例模式的应用:


1、饿汉式单例模式(静态初始化)


(1)vb.net版

Public NotInheritable Class frmInquirtyLineRecord 'frmInquirtyLineRecord-查看学生上机记录窗体。NotInheritable-指定类不能作为基类或者叫密封类(不能被继承的类)
    Shared ReadOnly frmInquirtyLR As New frmInquirtyLineRecord()
    Shared Sub New()
    End Sub
    Private Sub New()
        '此调用是设计器所必需的。
        InitializeComponent()  '初始化组件
        '在 InitializeComponent() 调用之后添加任何初始化。
    End Sub
    Public Shared ReadOnly Property GetInstance() As frmInquirtyLineRecord   'Property声明用于存储和检索属性值的属性名称和属性过程
        Get
            Return frmInquirtyLR
        End Get
    End Property
End Class


 

(2)C#版

 
   public sealed class Singleton  //sealed-此修饰符会阻止其他类从该类继承
    {
        private static readonly Singleton instance = new Singleton();
        private Singleton() { }
        public static Singleton GetInstance()
        {
            return instance;
        }
    }

对比一下就能发现共同之处,语言是可套用的。

2、懒汉式单例模式:


Public Class frmInquirtyBalance

    Private Shared mdfrmInquirtyBalance As frmInquirtyBalance
    Shared Sub New()
    End Sub
    Private Sub New()
        ' 此调用是设计器所必需的。
        InitializeComponent()  '初始化组件
        ' 在 InitializeComponent() 调用之后添加任何初始化。
    End Sub

    Public Shared Function GetInstance() As frmInquirtyBalance    '写一个公有的方法来检验这个类是否初始化以及被释放过
      If mdfrmInquirtyBalance Is Nothing OrElse mdfrmInquirtyBalance.IsDisposed Then
            mdfrmInquirtyBalance = New frmInquirtyBalance

        End If

        Return mdfrmInquirtyBalance

    End Function

3、菜单栏的单击事件:

(1)如果使用静态初始化,那么应该调用ShowDialog(),这样点击关闭是将窗体隐藏而已,否则就会出现“无法访问已释放的对象

    Private Sub frmILR_Click(sender As Object, e As EventArgs) Handles frmILR.Click
        frmInquirtyLineRecord.GetInstance.ShowDialog() '窗体作为模式对话框,点击关闭,窗体隐藏,可重新显示该窗体

    End Sub



(2)懒汉模式,窗体单击事件

    Private Sub frmIB_Click(sender As Object, e As EventArgs) Handles frmIB.Click
        frmInquirtyBalance.GetInstance.Show()

    End Sub


特别注意:如果没有实例化,直接调用Show(),也就是下面这个样子。就会出现“对非共享成员的引用要求对象引用”:

    Private Sub frmIB_Click(sender As Object, e As EventArgs) Handles frmIB.Click
        'frmInquirtyBalance.GetInstance.Show()
        frmInquirtyBalance.Show()
    End Sub



四、总结:


特别注意的是:form里只是通过启动工具箱,至于工具箱窗体是否实例化过,应该由自己(工具箱窗体)来判断,这是自己的责任,而不是别人(form)的责任






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 85
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 85
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值