2010-11-22 8 views
4

Ich dachte über die Verwendung von Singleton-Muster in meinem Projekt, also suchte ich in StackOverflow nach einem phytonischen Weg, um es zu implementieren. Ich fand this question mit der angenommenen Antwort, die besagt, dass "ein Modul mit Funktionen (und nicht eine Klasse) würde gut als ein Singleton dienen". Auf der anderen Seite hatte die zweite Antwort einen Vorschlag, the Borg pattern zu verwenden. Für mich ist die Verwendung eines Moduls eine einfache und unkomplizierte Lösung, daher würde ich gerne verstehen, wenn Borg zu bevorzugen ist.Borg Muster oder nur Modul mit Funktionen

+1

Verwenden Sie ein Modul, bis das Gegenteil bewiesen ist. –

Antwort

3

ein Singleton und ein Modul nur eine Instanz, für alle Anwendungs ​​Lebensdauer. Diese Instanz wird instanziiert gehalten, auch wenn sie nicht benötigt wird.

Das Borg-Muster ist über den gemeinsamen Status. Jede Client-Klasse erstellt eine neue Instanz des Borg, aber diese Instanz wird entsorgt, wenn sie nicht mehr benötigt wird - es ist ein viel eleganterer Ansatz.

Darüber hinaus ist es viel einfacher, eine Borg zu subklassen oder zu spotten.

+3

+1: "leichter Unterklasse oder Mock eine Borg". Der Rest ist nicht hilfreich. Die Borg kann einfach für die Dauer der Anwendung erstellt werden und ein Modul kann geladen und gelöscht werden, um eine kürzere Lebensdauer zu haben. Der "geteilte Staat" ist eine Subtilität, die nichts erklären hilft. Halten Sie sich an das Unterklassengeschäft, das macht Sinn. –

3

Der Unterschied ist, dass Sie im Borg-Muster verschiedene Objekte haben, deren Attribute identisch sind, während die Verwendung der Modulversion Ihnen ein Objekt (das Modul) liefert.

Auch ein Objekt und ein Modul unterscheiden sich geringfügig: Sie können keine Module pürieren, aber Sie können Klassen pürieren. Sie können aber auch Operationen auf Objekte (>, <, +, -, etc.)

Um ein bisschen off-topic: mit einigen Änderungen des Borg-Muster kann als eine sehr einfache Multiton verwendet werden:

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

Können Sie stattdessen eine statische Klasse verwenden? 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

Punkt genommen, nur eine Idee – Sam

1

Ich habe einen Anwendungsfall, wo borg Muster scheint:

Sie nicht Funktion auf Modulebene als @property definieren. Wenn Sie möchten, dass einige allgemeine Daten (wie config) dynamische Eigenschaften zurückgeben, können Sie sie von Borg ableiten lassen und dann Property-Methoden schreiben.

Verwandte Themen