.net 如何初始化单例?

.net 如何初始化单例?,.net,vb.net,singleton,.net,Vb.net,Singleton,有时需要使用一些帮助器值初始化singleton类。但是我们不能为它“发布”构造函数。解决这个问题的方法是什么 注意! 重载GetInstance或设置颜色不是我的主意。颜色只能设置一次。我想确保我的画师只使用初始化的颜色绘制应使用任何默认颜色 为了更清楚,我提供了一个示例: ''' <summary> ''' Singleton class MyPainter ''' </summary> Public Class MyPainter Private Shared

有时需要使用一些帮助器值初始化singleton类。但是我们不能为它“发布”构造函数。解决这个问题的方法是什么

注意! 重载GetInstance或设置颜色不是我的主意。颜色只能设置一次。我想确保我的画师只使用初始化的颜色绘制应使用任何默认颜色

为了更清楚,我提供了一个示例:

''' <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);