シングルトンパターンとは
シングルトンパターンは、あるクラスのインスタンスが1つだけしか作成されないことを保証するデザインパターンです。例えば、ログ管理などで1つのオブジェクトを共有する必要がある場合に使用されます。
メタクラスを使ったシングルトンの実装
Python
でシングルトンを実装する最も一般的な方法は、メタクラスを使用することです。以下は基本的なメタクラスを使ったシングルトンの実装例です。
class Singleton(type):
_instances = {}
def __call__(cls, *args, kwargs):
if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, kwargs)
return cls._instances[cls]
class MyClass(metaclass=Singleton):
pass
__call__
メソッドは、新しいインスタンスを生成する際に呼び出されますが、すでにインスタンスが存在する場合は、同じインスタンスを返すようにします。
メタクラスの利点
メタクラスを使うことで、シングルトンパターンをクラス全体で適用し、複数の継承クラスにも自動的に対応できます。また、コードがシンプルで読みやすいのも利点です。
デコレータを使ったシングルトンの実装
デコレータを使ってシングルトンパターンを実装する方法もあります。この方法では、クラスに対して関数を適用し、シングルトンの挙動を持たせます。
def singleton(cls):
instances = {}
def get_instance(*args, kwargs):
if cls not in instances:
instances[cls] = cls(*args, kwargs)
return instances[cls]
return get_instance
@singleton
class MyClass:
pass
このデコレータは、クラスが呼び出されたときに新しいインスタンスを作成するか、すでに存在するインスタンスを返します。
デコレータの利点
デコレータを使う方法は、クラスの定義に直接変更を加える必要がないため、シンプルに実装できる点が魅力です。ただし、メタクラスほどの柔軟性はありません。
まとめ
Python
でシングルトンパターンを実装するには、メタクラスかデコレータを使う方法が一般的です。メタクラスは柔軟性が高く、複数のクラスや継承に対応しやすい一方、デコレータはシンプルな実装が可能です。シングルトンは特定の用途で有効ですが、使用の際は注意が必要です。