2010-11-22 15 views
4

私は自分のプロジェクトでSingletonパターンを使うことを考えていたので、StackOverflowを検索してPythonメソッドを実装しました。 "(クラスではなく)関数を持つモジュールは、シングルトンとしても役に立ちます。"と答えると、this questionが見つかりました。一方、2番目の答えはthe Borg patternを使用するように提案されました。モジュールを使用している私にとっては、シンプルで簡単な解決策ですので、Borgを使用することが望ましいと理解したいと思います。Borgパターンまたは関数を含むモジュール

+1

別途証明されるまで、モジュールを使用してください。 –

答えて

3

シングルトン及びモジュールは、すべてのアプリケーションの寿命のために、唯一のインスタンスを表します。このインスタンスは、必要がない場合でもインスタンス化されたままです。

borgパターンはほぼ共有状態です。各クライアントクラスはborgの新しいインスタンスを作成しますが、それがもはや必要でないときにそのインスタンスが破棄されます。これははるかにエレガントなアプローチです。

これを超えると、borgのサブクラス化や模擬がはるかに簡単です。

+3

+1: "borgをサブクラス化するか模擬するのが簡単"残りは役に立たない。 Borgはアプリケーションの期間中簡単に作成することができ、モジュールのロードと削除を行うことで寿命が短くなります。 「共有状態」は、何かを明確にするのに役立たない微妙なことです。サブクラスのビジネスにこだわる、それは理にかなっている。 –

3

違いは、Borgパターンでは、モジュールのバージョンを使用しているときに属性が同じ異なるオブジェクトを持つことになり、オブジェクト(モジュール)が1つになります。

また、オブジェクトとモジュールは少し異なります。モジュールをピクルすることはできませんが、クラスをピクルすることはできます。 (>、<、+、 - 、など)。また、あなたは、オブジェクトに対する操作を持つことができ

があるためにビットオフトピック:

:いくつかの変更でボルグパターンは非常に単純なMultitonとして使用することができます
class Multiton(object): 
    __shared_states = {} 

    def __init__(self, name): 
     if not self.__shared_states.has_key(name): 
      self.__shared_states[name] = {} 

     self.__dict__ = self.__shared_states[name] 
1

代わりに静的クラスを使用できますか? SO Question

i.e.

class Test(object): 
    i = 3 # class (or static) variable 
    @classmethod 
    def g(cls, arg): 
     # here we can use 'cls' instead of the class name (Test) 
     if arg > cls.i: 
      cls.i = arg # would the the same as Test.i = arg1 
+1

http://dirtsimple.org/2004/12/python-is-not-java.html –

+0

ポイントは、ただのアイデアです – Sam

1

ボーグパターンが輝くところ私は1つのユースケースを持っている:あなたは@propertyとしてモジュールレベルで関数を定義することはできません

。共通のデータ(configなど)が動的プロパティを返すようにするには、Borgから派生させてからプロパティメソッドを書き込むことができます。

関連する問題