Pergunta

Eu não posso parecem compreender os conceitos próprios de uma fábrica.

Alguém pode me ajudar a codificar um teste simples? Eu li alguns textos sobre o código de internet e não posso lo da mesma maneira. Na verdade eu não posso entender o processo. Copiar o código é fácil, mas eu preciso saber por que isso não vai funcionar.

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

Solução

Seu código é contra-produtiva (desculpe, eu devo dizer que).

O sentido de uma fábrica é que você não tem que saber a classe do seu objeto construído na posição onde você criá-lo.

A razão é que a criação do objeto cria uma lacuna no orientada a objeto abstração. Você deve ser concreto na criação do objeto. Mas às vezes você só quer criar um objeto com algum comportamento, mas alguém deve decidir (central) que classe concreta que é.

Por exemplo, você deve criar um tipo de objeto em 100 lugares. Mas depois que você pode descobrir, que você deve alterar a classe -. Você teria que mudar todos esses lugares

A fábrica irá eliminar essa necessidade através da definição de um lugar que você deve mudar.

A fábrica mais simples seria:

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

Claro, isso pode ser de pouca ajuda em algumas situações. Então, algumas fábricas pode também carregar os nomes de classe de db ou alguma outra configuração. Mas a solução mais simples é uma construção de hard-coded do objeto -. Apenas neste método deve ser mudado no nosso exemplo, quando você escolher para sempre chamar esse método

Uma solução um tanto mais dinâmico (sem necessidade de um db):

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

myFactory = Factory(testClass)

A instância myFactory pode ser usado em diferentes locais para criar as instâncias corretas. O problema é, como inicializar myFactory - em algum módulo especial ??

Outras dicas

padrão

fábrica destina-se a idiomas que não permitem programar funções (e classes) como valores de primeira ordem (como C ++ ou Java).

A idéia é que você passar uma instância de uma classe "fábrica" ??como um argumento para alguma função (ou método ou construtor), que é então utilizado para produzir novas instâncias de objetos (normalmente estes são exemplos de alguns subclasse específica de um superclasse que é conhecido com antecedência).

Em Python, você pode simplesmente passar a classe em vez (porque as classes (e funções) também são objetos).

Seu método de fabricar deve ficar assim:

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

se candidatar () leva em uma lista de argumentos. Ao tomar em args * em seu método fabricateAnotherObject, você consome todos os parâmetros além obj como uma lista que pode ser passado para aplicar ().

Veja também tipo () em docs.python.org/library/functions:

tipo (nome, bases, Dict)

retornar um novo tipo de objeto. Esta é essencialmente uma forma dinâmica da declaração de classe. A cadeia de nome é o nome da classe e se torna o atributo __name__; as bases tupla relaciona as classes de base e transforma-se no atributo __bases__; eo dicionário dict é o namespace que contém definições para corpo de classe e torna-se o atributo __dict__. Por exemplo, as duas instruções a seguir criam objetos do tipo idênticos:

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

Para um verdadeiro programa curto com um uso de fábricas (compacta a construção de lotes de dicts especiais), ver ofc2.py .
Especialistas, mais exemplos agradar?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top