- Pythonとデザインパターンの学習記録。今回はSingletonパターンについてメモする。
Singleton パターンとは
- デザインパターンの1つ。
- オブジェクト指向では、一般的に1つのクラスから複数のインスタンスを作成することができる。
- Singletonはアプリケーション全体でインスタンスを1つしか生成されないよう保証する仕組みを指す。
クラス図と条件
-
同じ型のインスタンスをprivate なクラス変数として定義する。
-
コンストラクタの可視性をprivateとする。
-
同じ型の同じ型のインスタンスを返す
getInstance()
クラスメソッドを定義する。
※Wikiより
サンプルプログラム
-
singleton.py
※スレッド制御は未考慮。
class Singleton:
# 条件1. 同じ型のインスタンスをprivate なクラス変数として定義する。
## 1インスタンスしか生成しないことを保証するために利用する。
_unique_instance = None
# 条件2. コンストラクタの可視性をprivateとする。
## pythonの場合、コンストラクタをprivate定義できない。
## コンストラクタ呼び出しさせず、インスタンス取得をget_instanceに限定する。
## get_instanceからインスタンス取得を可能にするため、__init__は使用しない。
## 初期化時に、__new__が__init__よりも先に呼び出される。
def __new__(cls):
raise NotImplementedError('Cannot Generate Instance By Constructor')
# インスタンス生成
@classmethod
def __internal_new__(cls):
return super().__new__(cls)
# 条件3:同じ型のインスタンスを返す `getInstance()` クラスメソッドを定義する。
@classmethod
def get_instance(cls):
# インスタンス未生成の場合
if not cls._unique_instance:
cls._unique_instance = cls.__internal_new__()
return cls._unique_instance
if __name__ == '__main__':
ins1 = Singleton.get_instance()
print(ins1)
ins2 = Singleton.get_instance()
print(ins2)
# 同一インスタンスであることの確認
print(ins1 == ins2)
動作確認
python singleton.py
<__main__.Singleton object at 0x00000292A08B31C0>
<__main__.Singleton object at 0x00000292A08B31C0>
True