Choix d'implémentation du Pattern Singleton
Bonsoir,
Ceci est plutôt une interrogation qu'un réel problème, en faisant des recherches sur le pattern Singleton,
je me suis retrouvé face à 3 choix possibles qui a priori fonctionnent/sont fonctionnellement équivalents ;
et en fait je me demande surtout quelles sont leurs différences :
- si une écriture est à privilégier,
- si oui dans quels cas (pour tous les cas ?),
- les qualités/défauts de chaque pour faire court.
(Notamment en ce qui concerne la 3ème implémentation où je pige pas trop "le truc magique" :aie:)
1ère implémentation: le Singleton "classique"
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
Public NotInheritable Class Singleton
Private Shared _Instance As Singleton
Private Shared ReadOnly _SyncRoot As New Object
Private Sub New()
End Sub
Shared ReadOnly Property Instance As Singleton
Get
If IsNothing(_Instance) Then
SyncLock _SyncRoot
If IsNothing(_Instance) Then
_Instance = New Singleton
End If
End SyncLock
End If
Return _Instance
End Get
End Property
End Class |
2ème implémentation: le Singleton à initialisation tardive à l'aide de la classe Lazy(Of T) (Framework v4)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
Public NotInheritable Class Singleton
Private Shared ReadOnly _Instance As Lazy(Of Singleton)
Private Sub New()
End Sub
Shared Sub New()
_Instance = New Lazy(Of Singleton)(Function() New Singleton, True)
End Sub
Shared ReadOnly Property Instance As Singleton
Get
Return _Instance.Value
End Get
End Property
End Class |
3ème implémentation: le Singleton a classe imbriquée
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
Public NotInheritable Class Singleton
Shared ReadOnly Property Instance As Singleton
Get
Return Nested.Instance
End Get
End Property
Private Class Nested
Friend Shared ReadOnly Instance As New Singleton
'Constructeur statique explicite pour que le type
'ne soit pas marqué "beforefieldinit"
Shared Sub New()
End Sub
End Class
End Class |
En espérant que vous pourrez m'éclaircir tout cela :D, cordialement !