【Python デザインパターン】Singletonパターン
Singletonパターン
システム上のインスタンスを1つしか持たない状況を表現したい場合があります。
そういった場合によく使用するデザインパターンです。
Singletonパターンを利用することで、
偶発的なインスタンス生成を防ぐことが可能になります。
UML
Singletonパターンの基本的なクラス図
Pythonでシングルトンを実装するときの注意点
Javaでシングルトンを実装する際には、コンストラクタをprivateにしコンストラクタの呼び出しを制限しますが、
PythonにはJavaのようにprivate,protected,publicなどのアクセス修飾子はありません。
そのためインスタンス生成時に少し工夫をしてやる必要があります。
まずは下記リンクをご参照ください。
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)
実行結果
aとbを比較すると同じものであることがわかります。
インスタンスをprintしてみるとアドレスも同じことがわかると思います。
管理(Manager)クラスなどを作る際にSingletonパターンはとても有効です。
実務ではSingletonパターンが利用されるような箇所は基板部分によく使われるため、
私たちが実際に実装することは少ないかと思います。
ですが、このパターンを身に着けておくことでコードの読解力をかなり向上させることができますので、
是非覚えておくことをおススメします。