在讨论My名字空间的时候,IceShark让我看了一个他写的类库,这是一个封装了大量Windows常见操作的类,和My的思想颇有异曲同工之妙。其中一个命名空间让我倍感兴趣:DesignPatterns.CreationalPatterns。竟然能将设计模式做成类库,这是我前所未见的。我特地看了一下他的Singleton类,只有一个Instance()静态方法,当然是为了获取唯一的实例用的。但Singleton类没有其他任何功能,我们要使用显然要继承它。但问题是,继承一个Singleton类还是Singleton吗?我们看看Instance()的实现方法(在此对作者表示歉意,原库是没有源代码的,我进行了一点反向工程):
public static Singleton Instance()
{
if(__Singleton == null)
__Singleton = new Singleton();
return __Singleton;
}
清楚地看到,new是作用在Singleton上的,只能返回Singleton的实例,而不能返回他子类的实例。此外,子类的变量也不能引用父类的实例,所以继承这个Singleton类根本不能做成能用的Singleton。那我们究竟有没有办法实现继承后的类仍是Singleton呢,我觉得可以尝试一下泛型:
Public Class Singleton(Of T As {Singleton(Of T), New})
Private Shared _instance As T
Private Shared _syncRoot As New Object
Public Shared Function GetInstnce() As T
If _instance Is Nothing Then
SyncLock _syncRoot
If _instance Is Nothing Then
_instance = New T
End If
End SyncLock
End If
Return _instance
End Function
End Class
现在我们可以试试继承这个类了:
Public Class SingSub
Inherits Singleton(Of SingSub)
End Class
注意,我们这里为什么要约束基类自身,主要是保证T的取值范围,否则就会做成工厂类了。这里的SingSub类的确像是一个Singleton了,可以作用这种语法使用它:
Dim s As SingSub = SingSub.GetInstnce()
但是,又一个问题出现了,这里约束了New,就必须让子类有一个可公共访问的构造函数,这可与Singleton大相径庭。私有他的构造函数又不能采用这个约束。不知大家对这种情况有没有什么好的解决方法,或者说Singleton模式还是无法写成类库的。