本記事はGoFのデザインパターンの1つであるSingletonパターンについての解説と実際に実装した記事になります。 ソースコード
インスタンスを1つだけ生成するように制御し、 生成した上記のインスタンスのみアクセスできるようにする。
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つだけ生成しなければいけない
という責任をクラス側に持たせるという考えになります。