Pregunta

Parece que no puedo comprender los conceptos adecuados de una fábrica.

¿Alguien puede ayudarme a codificar una prueba simple? Leí algunos textos en Internet y no puedo codificarlo de la misma manera. En realidad no puedo entender el proceso. Copiar código es fácil, pero necesito saber por qué esto no funciona.

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)
¿Fue útil?

Solución

Su código es contraproducente (lo siento, debo decirlo).

El sentido de una fábrica es que no tienes que saber la clase de tu objeto construido en la posición donde lo creas.

La razón es que la creación de objetos crea un vacío en la abstracción orientada a objetos. Debes ser concreto al crear el objeto. Pero a veces solo quieres crear un objeto con algún comportamiento, pero alguien más debería decidir (centralmente) qué clase concreta es.

Por ejemplo, debe crear un tipo de objeto en 100 lugares. Pero más tarde podría descubrir que debe cambiar la clase, tendría que cambiar todos esos lugares.

La fábrica eliminará esta necesidad definiendo un lugar que debe cambiar.

La fábrica más simple sería:

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

Por supuesto, esto podría ser de poca ayuda en algunas situaciones. Por lo tanto, algunas fábricas también pueden cargar los nombres de clase de db o alguna otra configuración. Pero la solución más simple es una construcción codificada del objeto: solo nuestro método debe cambiarse en nuestro ejemplo, cuando elige llamar siempre a este método.

Una solución algo más dinámica (sin necesidad de una base de datos):

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

myFactory = Factory(testClass)

La instancia de myFactory se puede usar en diferentes ubicaciones para crear las instancias correctas. El problema es, ¿cómo inicializar myFactory, en algún módulo especial?

Otros consejos

El patrón de fábrica está destinado a lenguajes de programación que no permiten funciones (y clases) como valores de primer orden (como C ++ o Java).

La idea es que pase una instancia de una "fábrica" clase como un argumento para alguna función (o método o constructor), que luego se utiliza para producir nuevas instancias de objeto (por lo general, son instancias de alguna subclase específica de una superclase que se conoce de antemano).

En Python, puede pasar la clase en su lugar (porque las clases (y las funciones) también son objetos).

Su método de fabricación debería verse así:

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

apply () toma una lista de argumentos. Al tomar * args en su método fabricateAnotherObject, consume todos los parámetros más allá de obj como una lista que se puede pasar a apply ().

Consulte también type () en docs.python.org/library/functions:

tipo (nombre, bases, dict)

Devuelve un nuevo objeto de tipo. Esta es esencialmente una forma dinámica de la declaración de clase. La cadena de nombre es el nombre de la clase y se convierte en el atributo __name__; la tupla de bases detalla las clases base y se convierte en el atributo __bases__; y el diccionario dict es el espacio de nombres que contiene definiciones para el cuerpo de la clase y se convierte en el atributo __dict__. Por ejemplo, las siguientes dos declaraciones crean objetos de tipo idéntico:

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

Para un programa real corto con un solo uso de fábricas (construcción compacta de muchos dictados especiales), vea ofc2.py .
Expertos, ¿más ejemplos, por favor?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top