シングルトンパターンとは

シングルトンパターンは、あるクラスのインスタンスが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でシングルトンパターンを実装するには、メタクラスかデコレータを使う方法が一般的です。メタクラスは柔軟性が高く、複数のクラスや継承に対応しやすい一方、デコレータはシンプルな実装が可能です。シングルトンは特定の用途で有効ですが、使用の際は注意が必要です。