机房收费中的单例模式

    不知道你做机房时是如何处理这样的问题,即有些类也需要计划生育,而且生还是不生是自己的责任,所以在机房中这个工作就放在MDI子窗体中,真的不知道如何没有单例模式该如何解决这个问题?

一:模式核心

     单例模式保证一个类仅有一个实例,该类除了负责保存它的唯一实例,还提供一个访问该实例的方法。

1、声明一个静态类变量,用来存放实例化的对象

2、构造方法私有,外部代码不能直接new来实例化它

3、定义一个得到类实例的方法,也是静态,如果该类是null或者被dispose过则new它,并保存在声明的静态变      量中,以后就不用实例而得到它了

二:代码实现

    在MDI子类中写好得到它实例的方法,父类中直接调用该方法即可。

Public Class frmInquirePresentCash   
    Private Shared fIPC As frmInquirePresentCash  '声明一个静态类变量,类似C#中static
    Private Sub New()   '初始化为私有,外部代码不能直接new来实例化该窗体
        ' 此调用是设计器所必需的。
        InitializeComponent()
        ' 在 InitializeComponent() 调用之后添加任何初始化。
    End Sub
    Public Shared Function GetInstance() As frmInquirePresentCash '得到该窗体实例的方法
        If fIPC Is Nothing OrElse fIPC.IsDisposed Then '当窗体关闭或者被处理过就实例化该窗体,因为关闭后不会将变量设置为nothing,只是将窗体dispose掉
            fIPC = New frmInquirePresentCash()
            fIPC.MdiParent = frmMain
        End If
        Return fIPC  '如果已经实例化则返回窗体本身
    End Function

三;思考

 1、为什么加上IsDisposed?

    isnothing是没有打开过,isdisposed是被处理过,当窗体关闭时不会自动设置为nothing,只是将窗体disposed,如果没有关闭窗体后就不会再出现新窗体了。

 2、为什么用orElse

     orElse是vb.net新引入的运算符,相当于or,最大的特性是会自动实现“最短路径”,所谓“最短路径”就是指:当第一个被比较的运算式的结果已经能决定运算的最终结果时,就不会再去比较其他运算式,因此可以避免掉额外且不需要的比较运算式。 比如, If a = 1 Or b = 2和 If a = 1 OrElse b = 2 当用or的时候,a=1和b=2这2个条件,都会被判断。而用orelse,则当前面一个条件(a=1)已经能决定最终结果的话,程序就不会在判断第二个条件(b=2)了。

3、vbsharedc#static

他们是同一个意思,不同的关键字而已,C#中的静态往往指“方法”或“属性”是固定的、不会发生变化的、编译时就能确定下来的,而在.net中用shared关键字。

4、遗留:

     在每个子窗体前都声明为static,这样在子窗体之间也不能相互引用,比如添加用户是添加删除用户窗体的一个生成窗体,我这是不能用添加删除用户窗体的东西,还没有找到方法?

     学习这个内容最大感受,遇到问题不要慌张,而是去找方法,问问自己为什么要这么做,而且通过比较去发现和自己已经知道的有什么关系。

   



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值