No.
2023-08-22
  • Jan
  • Feb
  • Mar
  • Apr
  • May
  • Jun
  • Jul
  • Aug
  • Sep
  • Oct
  • Nov
  • Dec
  • Sun
  • Mon
  • Tue
  • Wed
  • Thu
  • Fri
  • Sat
  • 27
  • 28
  • 29
  • 30
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

Singleton

概要

  • シングルトン(クラス)とは、システム中にそのクラスのインスタンスが1つしか存在しないという、デザインパターンの1つ
  • 最初の1つ目のインスタンスをシステム全体で使い回す
  • シングルトンはステートレスなオブジェクトであるべき
    • ステートレス:状態を持たない。すなわち過去のデータが未来に影響を与えない。ユーザーによって挙動を変えない。
  • 利用例:設定ファイル、ログファイル
  • 類義:シングルインスタンス

利点

  • 指定したクラスのインスタンスが1つしか存在しないことを保証することができる

欠点

  • インスタンスが1つしかないので、マルチスレッド下では同時編集など注意しなければならない
  • リレーションがあると、それも一緒に消えてしまう可能性がある(on_delete=CASCADEの場合)
    • = 変更履歴が残せない

結論

  • シングルトンが有効なケースはかなり限られている
  • 実装の仕方によっては後戻りできないので、シングルトンにするときは十分に検討すること

実装方法(Django)

厳密にはシングルトンではないが…

class SingletonModel(models.Model):
    # Singleton Django Model

    class Meta:
        abstract = True

    def save(self, *args, **kwargs):
        # Save object to the database. Removes all other entries if there are any.

        self.__class__.objects.exclude(id=self.id).delete()
        super().save(*args, **kwargs)

参考:https://stackoverflow.com/questions/49735906/how-to-implement-singleton-in-django