不知道你做机房时是如何处理这样的问题,即有些类也需要计划生育,而且生还是不生是自己的责任,所以在机房中这个工作就放在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、vb中shared和c#中static
他们是同一个意思,不同的关键字而已,C#中的静态往往指“方法”或“属性”是固定的、不会发生变化的、编译时就能确定下来的,而在.net中用shared关键字。
4、遗留:
在每个子窗体前都声明为static,这样在子窗体之间也不能相互引用,比如添加用户是添加删除用户窗体的一个生成窗体,我这是不能用添加删除用户窗体的东西,还没有找到方法?
学习这个内容最大感受,遇到问题不要慌张,而是去找方法,问问自己为什么要这么做,而且通过比较去发现和自己已经知道的有什么关系。