2009-10-30 11 views
5

Non riesco a cogliere i concetti corretti di una fabbrica.Python e fabbriche

Qualcuno può aiutarmi a programmare 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 è facile, ma ho bisogno di 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) 
+0

L'utilizzo di 'apply()' è sbagliato (non accetta argomenti di parole chiave), ma in ogni caso 'apply()' è deprecato usare la sintassi 'obj (** kwargs)'. – jfs

risposta

13

Il tuo codice è controproducente (mi dispiace, devo dirlo).

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

Il motivo è che la creazione dell'oggetto crea una lacuna nell'astrazione orientata agli oggetti. Devi essere concreto nel creare l'oggetto. Ma a volte vuoi solo creare un oggetto con qualche comportamento, ma qualcun altro dovrebbe decidere (a livello centrale) in quale classe essa sia.

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

La fabbrica eliminerà questa necessità definendo un luogo che è necessario modificare.

La fabbrica più semplice sarebbe:

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

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

Una soluzione un po 'più dinamico (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 utilizzato in diverse posizioni per creare le istanze corrette. Il problema è, come inizializzare myFactory - in qualche modulo speciale ??

+0

Ovviamente nel mio esempio costruito, non hai bisogno di una classe factory - basterà una semplice funzione di fabbrica, come puoi vedere che l'auto-param non è usato. – Juergen

+0

Juergen. Questo è esattamente ciò di cui ho bisogno. Devo dire grazie per le tue parole. Questo qui pubblicato è solo un esempio. –

+0

Oh appena realizzato che l'oggetto è stato risolto. Avevo bisogno di essere scelto dinamicamente. Penserò a qualcosa. Grazie: D –

0

tuo metodo di fabbricare dovrebbe assomigliare a questa:

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

applicano() prende in un elenco di argomenti. Inserendo * args nel metodo fabricateAnotherObject, si consumano tutti i parametri oltre a obj come una lista che può essere passata per apply().

+0

downvote: questo è un commento, non una risposta – g33kz0r

4

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

L'idea è di passare un'istanza di una classe "factory" come argomento a qualche funzione (o metodo o costruttore), che viene quindi utilizzata per produrre nuove istanze di oggetto (in genere si tratta di istanze di alcune sottoclassi specifiche di una superclasse che è conosciuta in anticipo).

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

0

Vedere anche type() in docs.python./ Library/funzioni org:

tipo (nome, basi, dict)

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

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

per programmi reale con un impiego di fabbriche (compatto costruzione molto dicts speciali), vedi ofc2.py.
Esperti, altri esempi per favore?

Problemi correlati