Frage

Ich kann nicht scheinen, die richtigen Konzepte einer Fabrik zu erreichen.

Kann mir jemand helfen, einen einfachen Test Code? Ich las einige Texte über das Internet und kippt Code es die gleiche Art und Weise. Eigentlich kann ich nicht verstehen, den Prozess. Kopieren Code ist einfach, aber ich brauche, warum diese nicht funktionieren zu lernen.

class Factory:

    def __init__(self):
        self.msg = "teste"

    def fabricateAnotherObject(self,obj,**kwargs):
        return apply(obj,**kwargs)

class testClass:
    def __init__(self,nome,salario,endereco):
        self.nome = nome
        self.salario = salario
        self.endereco = endereco

    def __str__(self):
        return "Nome: " + str(self.nome) + "\nEndereco: " + str(self.endereco) + "\nSalario: " + str(self.salario) 

a = Factory()
emp = a.fabricateAnotherObject(testClass,"George",2000,"Three Four Five Avenue")
print str(emp)
War es hilfreich?

Lösung

Der Code ist kontraproduktiv (sorry, ich muss es sagen).

Der Sinn einer Fabrik ist, dass Sie nicht in der Lage, die Klasse Ihres konstruiertes Objekt wissen, wo Sie es schaffen.

Der Grund dafür ist, dass die Objekterstellung entsteht eine Lücke in objektorientierter Abstraktion. Sie müssen bei der Erstellung des Objektes konkret sein. Aber manchmal möchte man einfach ein Objekt mit einem gewissen Verhalten zu schaffen, sondern jemand anderes sollte entscheiden (zentral), welche konkrete Klasse ist.

Zum Beispiel müssen Sie eine Art von Objekt in 100 Orten erstellen. Aber später könnten Sie feststellen, dass Sie die Klasse ändern müssen -. Sie müßten all diese Orte ändern

Die Fabrik wird diese Notwendigkeit beseitigen, um eine Stelle zu definieren, die Sie ändern müssen.

Die einfachste Fabrik wäre:

def fabricateAnotherObject(self, **kwargs):
    return testClass(**kwargs)

Natürlich ist dies wenig hilfreich in einigen Situationen sein könnte. So könnten einige Fabriken laden auch die Klassennamen von db oder einer anderen Konfiguration. Aber die einfachste Lösung ist eine hartcodierte Konstruktion des Objekts -. Nur diese Methode muss in unserem Beispiel geändert werden, wenn Sie sich entscheiden, immer diese Methode aufrufen

Eine etwas dynamischere Lösung (ohne Notwendigkeit für eine db):

class Factory(object):
   def __init__(self, theClass):
       self.theClass = theClass
   def create(self, **kwargs):
       self.theClass(**kwargs)

myFactory = Factory(testClass)

Die myFactory Instanz kann für die Erstellung der richtigen Instanzen in verschiedenen Orten verwendet werden. Das Problem ist, wie myFactory initialisiert werden - in einigen speziellen Modul ??

Andere Tipps

Werksmuster für Programmiersprachen gedacht, die nicht zulassen Funktionen (und Klassen) als erste Ordnung Werte (wie C ++ oder Java).

Die Idee ist, dass Sie eine Instanz einer „Fabrik“ Klasse als Argument für eine Funktion (oder Methode oder Konstruktor) übergeben, die dann neue Objektinstanzen verwendet wird, zu erzeugen (in der Regel sind dies Fälle von einiger spezifischen Unterklasse von a Super, das im Voraus bekannt ist).

In Python, können Sie einfach die Klasse übergeben statt (weil Klassen (und Funktionen) sind auch Objekte).

Ihre fabrizieren Methode sollte wie folgt aussehen:

    def fabricateAnotherObject(self, obj, *args):
        return apply(obj, args)

apply () nimmt in einer Liste von Argumenten. Durch die in * args in Ihrer fabricateAnotherObject Methode, verbrauchen Sie alle Parameter über obj als eine Liste, die übergeben werden können, anzuwenden ().

Siehe auch Typen () in docs.python.org/library/functions:

Typ (Name, Basen, dict)

Gibt einen neuen Typ Objekt. Dies ist im Wesentlichen eine dynamische Form der Klassenanweisung. Der Name String ist der Name der Klasse und wird die __name__ Attribut; Die Basen Tupels itemizes die Basisklassen und wird zum __bases__ Attribut; und das dict Wörterbuch ist der Namespace-Definitionen für Klasse Körper enthält, und wird das __dict__ Attribut. Erstellen Sie zum Beispiel die folgenden beiden Aussagen identischen Typs Objekte:

class X(object):
    a = 1
X = type('X', (object,), dict(a=1))

Für einen kurzen richtiges Programm mit einem Einsatz von Fabriken (kompakt viele spezielle dicts Gebäude), siehe ofc2.py .
Experten, mehr Beispiele bitte?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top