.net 如何初始化单例?
有时需要使用一些帮助器值初始化singleton类。但是我们不能为它“发布”构造函数。解决这个问题的方法是什么 注意! 重载GetInstance或设置颜色不是我的主意。颜色只能设置一次。我想确保我的画师只使用初始化的颜色绘制应使用任何默认颜色 为了更清楚,我提供了一个示例:.net 如何初始化单例?,.net,vb.net,singleton,.net,Vb.net,Singleton,有时需要使用一些帮助器值初始化singleton类。但是我们不能为它“发布”构造函数。解决这个问题的方法是什么 注意! 重载GetInstance或设置颜色不是我的主意。颜色只能设置一次。我想确保我的画师只使用初始化的颜色绘制应使用任何默认颜色 为了更清楚,我提供了一个示例: ''' <summary> ''' Singleton class MyPainter ''' </summary> Public Class MyPainter Private Shared
''' <summary>
''' Singleton class MyPainter
''' </summary>
Public Class MyPainter
Private Shared _pen As Pen
Private Shared _instance As MyPainter = Nothing
Private Sub New()
End Sub
''' <summary>
''' This method should be called only once, like a constructor!
''' </summary>
Public Shared Sub InitializeMyPainter(ByVal defaultPenColor As Color)
_pen = New Pen(defaultPenColor)
End Sub
Public Shared Function GetInstance() As MyPainter
If _instance Is Nothing Then
_instance = New MyPainter
End If
Return _instance
End Function
Public Sub DrawLine(ByVal g As Graphics, ByVal pointA As Point, ByVal pointB As Point)
g.DrawLine(_pen, pointA, pointB)
End Sub
End Class
“”
“我的画家是单身阶级”
'''
公共级画家
专用共享笔作为笔
私有共享_实例作为MyPainter=Nothing
私人分新
端接头
'''
''这个方法应该只调用一次,就像构造函数一样!
'''
公共共享子初始值emypainter(ByVal defaultPenColor作为颜色)
_钢笔=新钢笔(默认铅笔颜色)
端接头
公共共享函数GetInstance()作为MyPainter
如果_实例什么都不是,那么
_instance=newmypainter
如果结束
返回_实例
端函数
公共辅助绘图线(ByVal g作为图形,ByVal pointA作为点,ByVal pointB作为点)
g、 抽绳(_pen,pointA,pointB)
端接头
末级
谢谢。您能不能不让GetInstance方法过载
Dim _IsInitialized as boolean = false
Public Shared ReadOnly Property IsInitialized() As Boolean
Get
Return _IsInitialized
End Get
End Property
Public Shared Function GetInstance() As MyPainter
If _instance Is Nothing Then
_instance = New MyPainter
End If
_IsInitialized = True
Return _instance
End Function
Public Overloads Shared Function GetInstance(ByVal DefaultPenColor As Color) As MyPainter
If _instance Is Nothing Then
_instance = New MyPainter
InitializeMyPainter(DefaultPenColor)
End If
_IsInitialized = True
Return _instance
End Function
在调用GetInstance方法之前,请检查它是否已初始化。如果没有,给它一个钢笔颜色
If MyPainter.IsInitialized then
Dim Painter as MyPainter = MyPainter.GetInstance
Else
Dim Painter as MyPainter - MyPainter.GetInstance(System.Drawing.Color.Red)
EndIf
您可以声明共享构造函数,但它们必须是无参数的:
Public Class MyPainter
Private Shared _pen As Pen
Shared Sub New()
_pen = New Pen(Color.White)
End Sub
....
End Class
您可以在构造函数中将颜色设置为合理的默认值,然后根据需要添加一个帮助器方法来更改颜色,就像您在示例中所做的那样:
Public Shared Sub SetColor(ByVal defaultPenColor As Color)
_pen = New Pen(defaultPenColor)
End Sub
可以在GetInstance中使用可选参数
Public Shared Function GetInstance(Optional ByVal defaultPenColor As Color = Colors.Red) As MyPainter
If _instance Is Nothing Then
If defaultPenColor is nothing then
defaultPenColor = Colors.Red
end if
_pen = New Pen(defaultPenColor)
_instance = New MyPainter
End If
Return _instance
End Function
如果您只想在创建时初始化它一次,为什么不在构造函数中调用一些方法来初始化它呢?这些方法将从某处提取参数?如果将多次调用此初始化,请将其转换为单独的方法,如setOptions。创建一个采用所需参数的
CreateInstance
方法。并从GetInstance
中删除创建功能。虽然不完全是一个单例,但至少你知道事情会被正确初始化。你可以使用Init方法:(这是一个C#示例,我刚刚遇到了可初始化单例的相同问题)
如果尝试使用XSingleton unitinialized或多次尝试初始化,则会出现异常
因此,使用
XSingleton.Init(123);
现在可以使用初始化的值:
Console.WriteLine(XSingleton.Instance.Value);
因此,根据第一次调用GetInstance()时是否使用参数,以下调用将获得不同的对象?只有当您始终能够确定谁首先调用GetInstance()时,这才有效。不,它们将得到相同的对象。毕竟,这是一个单身班。唯一改变的是最初的钢笔颜色。对,这就是我的意思。今天我似乎无法用语言表达我的想法。。。如果您不能控制第一次调用,这仍然是一个问题。是的,但是无论您选择什么解决方案来解决这个问题,如果您想使用一些参数初始化,您都需要控制第一次调用。至少这样,GetInstance总是返回一个有效的对象。如果您愿意,可以添加一个公共方法来更改以后的值。这非常好,因为我不确定是否有人愿意使用带参数的方法。因此,如果我们发现一个颜色(值类型)作为参数是一个引用类型,我永远不能确定这个成员是否为Nothing(null)。不,不,重载GetInstance不是我的好主意。我想保证我的画师只画初始化的颜色。默认情况下应该使用任何默认颜色。我重载GetInstance的方式只会设置一次笔的颜色(第一次调用时)。您可以添加一个额外的共享成员,以查看该类是否已初始化。我已经更新了代码示例。如果它仍然不是你想要的,请告诉我。我同意。然而,你的函数并没有一个非常透明的意义,成为一个公共函数,可能会导致错误的(新的)开发人员。。。第二,只有我,这个单身的创造者会知道并记住在使用它之前不要忘记设置颜色_无参数GetInstance中的IsInitialized=True不正确,因为我不知道颜色是否已初始化。不幸的是,MyPainter不知道从何处获取此参数。。。并且应该明确定义默认颜色。
Console.WriteLine(XSingleton.Instance.Value);