【Python デザインパターン】Singletonパターン

Pythonで学ぶデザインパターン

Singletonパターン

システム上のインスタンスを1つしか持たない状況を表現したい場合があります。

そういった場合によく使用するデザインパターンです。

Singletonパターンを利用することで、

偶発的なインスタンス生成を防ぐことが可能になります。

UML

Singletonパターンの基本的なクラス図

Pythonでシングルトンを実装するときの注意点

Javaでシングルトンを実装する際には、コンストラクタをprivateにしコンストラクタの呼び出しを制限しますが、

PythonにはJavaのようにprivate,protected,publicなどのアクセス修飾子はありません。

そのためインスタンス生成時に少し工夫をしてやる必要があります。

まずは下記リンクをご参照ください。

【公式リファレンス】Pythonインスタンス生成

Pythonでシングルトンを実装する場合、__new__メソッドをオーバーライドさせる必要があります。

 

サンプルコード

Pythonでは静的なメソッドを宣言する場合には@classmethodを付ける必要がありますが、

__new__メソッドは上記のリンクにもあるよう明示的に宣言する必要はありません。

class Singleton:
    _singleton = None

    def __new__(cls,*args,**keys):
        if cls._singleton is None:
            cls._singleton = super().__new__(cls)
        return cls._singleton

    @classmethod
    def get_instance(cls):
        if cls._singleton is None:
            cls._singleton = Singleton()
        return cls._singleton

if __name__ == '__main__':
    a = Singleton()
    b = Singleton()
    print(a is b)

実行結果

exec_singleton

aとbを比較すると同じものであることがわかります。

インスタンスをprintしてみるとアドレスも同じことがわかると思います。

 

管理(Manager)クラスなどを作る際にSingletonパターンはとても有効です。

実務ではSingletonパターンが利用されるような箇所は基板部分によく使われるため、

私たちが実際に実装することは少ないかと思います。

ですが、このパターンを身に着けておくことでコードの読解力をかなり向上させることができますので、

是非覚えておくことをおススメします。

 

 

あわせて読みたい