VBによるsingleton

VB6のころからDB接続をラップしたオブジェクトをどう扱おうか悩んでいたのですが、VB2005では クラス変数が使えるようになりsingletonという考え方を容易に扱えるようになりました。 これで1つの解決方法が実現できます。

「singletonとは、唯一の存在を保証するためのパターンで、作成されたインスタンスが唯一存在することを 保証します。」

singletonは便利ではありますが、使うにあたって注意が必要なパターンであると考えています。

VBによるsingletonの実装

VB2005でのsingletonの実装例は次のようになります。

Public Class hoge
    Private Shared m_instance As hoge
    Public Shared Function Singleton() As hoge
        If m_instance Is Nothing Then
            m_instance = New hoge()
        End If

        Return m_instance
    End Function
End Class

VBによるsingletonの実装その2

上記実装でよいと思っていたのですが、MicrosoftのサイトにC#の例ですが 「C# でのシングルトンの実装」というページを見つけました。

上記ページには、上記例では「マルチスレッド環境の場合、安全性が確保されないことです。」と記載されています。

たしかに問題ありそうです。そこで、C#用に公開されている静的な初期化をVB2005用に書き換えてみます。

Public Class hoge
    Private Shared ReadOnly m_instance As New hoge
    Public Shared Function Singleton() As hoge

        Return m_instance

    End Function
End Class

この実装方法で問題なさそうですが、私のようにnewしたらdeleteしたくなる人には気持ちが悪いかもしれませんね。