KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

Python基礎 オブジェクト指向 2(Singleton)

登録日 :2025/09/19 19:23
カテゴリ :Python基礎

Singletonパターン

クラスが一つのインスタンスのみを持つことを保証し、このインスタンスへのアクセスするためのグローバルな方法を提供するパターン

開発者は一度しかインスタンス化してはならないといったことを気にしなくて良い

ただし、Singletonはアンチパターンと言われることが多い

Singletonの構成要素

  • privateなコンストラクタ
  • 唯一のインスタンスを得るためのstaticメソッド
  • いつも同じインスタンスを返却する

Singletonのオブジェクト指向的要素

  • 「カプセル化」を利用したパターン
  • 自分自身のインスタンスを内部に保持して管理
  • 他のクラスからのインスタンスへのアクセス方法も提供している。この方法でしか外部からアクセスできない。

Singletonのメリット・デメリット

メリット
  • クラスが一つのインスタンスしか持たないことを保証できる
  • インスタンスが一つなのでメモリ効率が良い
  • 最初にインスタンス化されたら以降は使い回しなので、生産コストがかからない
デメリット
  • 依存関係が非常にわかりにくい
  • Singletonが状態を保つ場合、密結合になる
  • 単体テストの実行が困難
  • マルチスレッドでのSingletonの扱いが難しい

Singletonの使い所

  • プログラム内のクラスで、全てのクライアントが使用できるインスタンスを必ず一つだけに制限したい場合
    例)
  • ロギング
  • キャッシュ管理
  • コンフィグ
  • データベース接続ドライバ

サンプルコード

import datetime


class Logger(object):
    _instance = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
        return cls._instance

    def output(self, content: str):
        now = datetime.datetime.now()
        print(f"[INFO]{now}: {content}")


class Test:
    pass


if __name__ == "__main__":
    test1 = Test()
    test2 = Test()
    print("Test:", test1 == test2)

    log1 = Logger()
    log2 = Logger()
    print("Singleton: ", log1 == log2)

    log1.output('logger1')
    log2.output('logger2')