Singletonパターン

本記事はGoFのデザインパターンの1つであるSingletonパターンについての解説と実際に実装した記事になります。 ソースコード

適応可能性

  • アプリケーション内にインスタンスが1つあれば良い場合や、1つしか存在してはいけない場合

解決策

インスタンスを1つだけ生成するように制御し、 生成した上記のインスタンスのみアクセスできるようにする。

UML図

コード例

class MySingleton:

    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, '_instance'):
            cls._instance = super().__new__(cls)
        return cls._instance

    def __init__(self):
        print('MySingleton', self)

    @classmethod
    def get_instance(cls):
        return cls.__new__(cls)

以下インスタンス化した結果になります。

s1 = MySingleton()
s2 = MySingleton()
s3 = MySingleton.get_instance()
print('s1 == s2 ? ', s1 == s2)
print('s2 == s3 ? ', s2 == s3)
print('s1 == s3 ? ', s1 == s3)

実行結果

MySingleton <singleton.MySingleton object at 0x1079beb50>
MySingleton <singleton.MySingleton object at 0x1079beb50>
s1 == s2 ?  True
s2 == s3 ?  True
s1 == s3 ?  True

上記のように MySingleton() の書き方だとインスタンスの初期化メソッドが実行されることに注意。

注意点

「インスタンス化はどうせ1回しかしない」や
「インスタンス化する側が気をつければ良いのでは」

といった考えを持つかもしれませんが、オブジェクト指向の基本として、
インスタンス化する側に上記の責務を持っていることが問題であり、
Singletonパターンはクラスを使う側が持っていた
1つだけ生成しなければいけない
という責任をクラス側に持たせるという考えになります。