Domanda

Non riesco a capire i concetti propri di una fabbrica.

Qualcuno può aiutarmi a codificare un semplice test? Ho letto alcuni testi su Internet e non posso codificarlo allo stesso modo. In realtà non riesco a capire il processo. Copiare il codice è semplice, ma devo imparare perché questo non funzionerà.

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)
È stato utile?

Soluzione

Il tuo codice è controproducente (scusami, devo dirlo).

Il senso di una fabbrica è che non devi conoscere la classe del tuo oggetto costruito nella posizione in cui la crei.

Il motivo è che la creazione di oggetti crea un vuoto nell'astrazione orientata agli oggetti. Devi essere concreto nel creare l'oggetto. Ma a volte vuoi solo creare un oggetto con un certo comportamento, ma qualcun altro dovrebbe decidere (centralmente) che classe concreta è.

Ad esempio, devi creare un tipo di oggetto in 100 posti. Ma più tardi potresti scoprire che devi cambiare classe - dovresti cambiare tutti quei posti.

La fabbrica eliminerà questa necessità definendo un posto che devi cambiare.

La fabbrica più semplice sarebbe:

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

Naturalmente, questo potrebbe essere di scarso aiuto in alcune situazioni. Quindi alcune fabbriche potrebbero anche caricare i nomi delle classi da db o da qualche altra configurazione. Ma la soluzione più semplice è una costruzione codificata dell'oggetto - solo questo metodo deve essere modificato nel nostro esempio, quando si sceglie di chiamare sempre questo metodo.

Una soluzione un po 'più dinamica (senza bisogno di un db):

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

myFactory = Factory(testClass)

L'istanza myFactory può essere utilizzata in posizioni diverse per creare le istanze corrette. Il problema è come inizializzare myFactory - in qualche modulo speciale ??

Altri suggerimenti

Il modello di fabbrica è destinato ai linguaggi di programmazione che non consentono funzioni (e classi) come valori del primo ordine (come C ++ o Java).

L'idea è di passare un'istanza di una "fabbrica" classe come argomento di una funzione (o metodo o costruttore), che viene quindi utilizzata per produrre nuove istanze di oggetto (in genere si tratta di istanze di una sottoclasse specifica di una superclasse che è nota in anticipo).

In Python, invece, puoi semplicemente passare la classe (poiché anche le classi (e le funzioni) sono oggetti).

Il tuo metodo di fabbricazione dovrebbe assomigliare a questo:

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

apply () contiene un elenco di args. Accettando * args nel metodo fabricateAnotherObject, si consumano tutti i parametri oltre obj come un elenco che può essere passato a apply ().

Vedi anche type () in docs.python.org/library/functions:

tipo (nome, basi, dict)

Restituisce un nuovo oggetto type. Questa è essenzialmente una forma dinamica dell'istruzione di classe. La stringa del nome è il nome della classe e diventa l'attributo __name__; la tupla delle basi elenca le classi di base e diventa l'attributo __bases__; e il dizionario dict è lo spazio dei nomi che contiene le definizioni per il corpo della classe e diventa l'attributo __dict__. Ad esempio, le seguenti due istruzioni creano oggetti di tipo identico:

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

Per un breve programma reale con un uso di fabbriche (costruzione compatta di molti dadi speciali), vedere ofc2.py .
Esperti, altri esempi per favore?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top