单例模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点。对于单例模式的概念和作用大家可以去问度哥,这篇文章主要将的是如何使用单例模式实现窗体的唯一。
先说说我的历程吧。
看了《大话设计模式》,感觉看懂了。然后就开始画时序图,主窗体在调用子窗体前先要经过一个判断类,判断该窗体是否已经别实例化。根据自己的思路就开始了自己的画图之旅,可是到底能不能实现呢,感觉应该能吧。在这里我就犯了一个严重的错误,“应该”并不代表“能”,这种模棱两可的回答就是一种错误,应该去实践一下。带着错误的思想越走越远,可是毕竟心里没底,越走越觉得有问题。终于决定塔下心来看看吧,就感觉自己的想法有问题,首先它并不知道去实例化那个窗体,照我的哪种想法它应该会给方法传进一个参数--窗体名,可是判断类并不能自行判断实例化什么窗体类。现在才发现自己的单例模式用的不对,重新回头审视,和师姐交流后,感觉有了思路。就想重新画图,师姐说:“你先敲一个DEMO,去实现一下。”我当时是真心不愿意去敲的,敲一个DEMO需要花费多长时间啊。又要建窗体又要写方法的,感觉好麻烦啊。没有办法写吧。在写的过程中遇到了这样那样的问题,但最终解决了,那是一种久违的兴奋。
下面就进入主题。
1先展示一下我得DEMO的目的。
目的:Form1作为主窗体,单击Button1后显示Form2窗体,单击Button2后显示Form3窗体
2代码展示
Public Class Form1
''' <summary>
''' 单击Button1,显示Form2窗体
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim Form2 As Form2 '定义了一个Form2类型的类
Form2.GetInstance().Show() '调用Form2类的方法返回窗体并显示。
End Sub
''' <summary>
''' 单击Button2,显示Form3窗体
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
Dim Form3 As Form3 '定义了一个Form3类型的类
Form3.GetInstance().Show() '调用Form3类的方法返回窗体并显示。
End Sub
End Class
Public Class Form2
Private Shared ftb As Form2 '声明一个静态的类变量
''' <summary>
''' Form2的构造方法私有,外部代码不能直接new来实例化它
''' </summary>
''' <remarks></remarks>
Private Sub New()
' 此调用是设计器所必需的。
InitializeComponent()
' 在 InitializeComponent() 调用之后添加任何初始化。
End Sub
''' <summary>
''' 得到类实例的方法,返回值就是本类对象
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function GetInstance() As Form2
If ftb Is Nothing Then '当ftb不存在或是已被进行关闭处理后,则实例化Form2
ftb = New Form2
Else
If ftb.IsDisposed Then
ftb = New Form2
End If
End If
Return ftb
End Function
End Class
Public Class Form3
Private Shared ftb As Form3 '声明一个静态的类变量
''' <summary>
''' Form3的构造方法私有,外部代码不能直接new来实例化它
''' </summary>
''' <remarks></remarks>
Private Sub New()
' 此调用是设计器所必需的。
InitializeComponent()
' 在 InitializeComponent() 调用之后添加任何初始化。
End Sub
''' <summary>
''' 得到类实例的方法,返回值就是本类对象
''' </summary>
''' <returns></returns>
''' <remarks></remarks>
Public Shared Function GetInstance() As Form3
'当ftb不存在或是已被进行关闭处理后,则实例化Form3
If ftb Is Nothing Then
ftb = New Form3
Else
If ftb.IsDisposed Then
ftb = New Form3
End If
End If
Return ftb
End Function
End Class
上面是一个简单的小DEMO,比较简单。从中我们不难看出调用窗体和被调用窗体之间的关系。我觉得在理解单例模式的时候,首先要理清调用窗体和被调用窗体之间的关系到底实不实例化由谁决定。被调用窗体对自身进行判断,然后决定是否实例化。而调用窗体只要定义、调用、show就可以了。
敲DEMO的时候遇到了一个小问题,下篇文章将问大家讲述。
通过这次小经历得出一个结论不要害怕去实践,敲一个DEMO才用多久啊,如果你去实践,等走了很远之后才发现问题,修改的工程量更大,得不偿失。