1. ホーム
  2. python

[解決済み] PythonでBorgパターンがSingletonパターンより優れている理由

2023-03-21 06:17:49

疑問点

なぜ ボーグパターン よりも良いのは シングルトンパターン ?

私は、それらが何か異なる結果をもたらすとは思えないので、私は尋ねます。

ボーグです。

class Borg:
  __shared_state = {}
  # init internal state variables here
  __register = {}
  def __init__(self):
    self.__dict__ = self.__shared_state
    if not self.__register:
      self._init_default_register()

シングルトンです。

class Singleton:
  def __init__(self):
    # init internal state variables here
    self.__register = {}
    self._init_default_register()

# singleton mechanics external to class, for example this in the module
Singleton = Singleton()

ここで表示したいのは、サービスオブジェクトはBorgとして実装されているかSingletonとして実装されているかに関わらず、自明ではない内部状態を持つ(それに基づいて何らかのサービスを提供する)ことです(つまり、何か役に立つものでなければならず、単なる遊びのSingleton/Borgではないのです)。

そして、この状態は開始されなければなりません。ここでは、シングルトンの実装はより簡単です。 init をグローバルステートのセットアップとして扱うので、シングルトンの実装はより簡単です。私は、Borgオブジェクトが自分自身を更新すべきかどうかを確認するために、その内部の状態を照会する必要があることを厄介だと感じています。

内部状態が多くなればなるほど、状況は悪化します。たとえば、オブジェクトがそのレジスタをディスクに保存するためにアプリケーションのティアダウンシグナルを聞く必要がある場合、その登録も同様に一度だけ行われるべきで、これはシングルトンでより簡単になっています。

どのように解決するのですか?

borgが異なる本当の理由は、サブクラス化にあります。

borgをサブクラス化すると、そのサブクラスのオブジェクトは、そのサブクラスで共有状態を明示的にオーバーライドしない限り、親クラスのオブジェクトと同じ状態を持ちます。シングルトン パターンの各サブクラスは独自の状態を持つので、異なるオブジェクトが生成されます。

また、シングルトンパターンでは、オブジェクトは実際には同じであり、状態だけではありません(状態が本当に重要な唯一のものであるにもかかわらず)。