Então, eu tenho uma fábrica que cria objetos de diferentes classes. As classes possíveis são todas derivadas de um ancestral abstrato. A fábrica possui um arquivo de configuração (sintaxe JSON) e decide qual classe criar, dependendo da configuração do usuário.
Para conseguir isso, a fábrica usa boost :: property_tree para análise JSON. Ele percorre a árvore e decide qual objeto concreto criar.
No entanto, os objetos do produto têm muitos campos (atributos). Dependendo da classe concreta, o objeto possui cerca de 5 a 10 atributos, no futuro talvez até mais.
Portanto, não tenho certeza de como deve ser o construtor dos objetos. Eu posso pensar em duas soluções:
1) O construtor do produto espera que cada atributo seja um parâmetro; portanto, o construtor terá mais de 10 parâmetros. Isso será feio e resultará em linhas de código longas e ilegíveis. No entanto, a vantagem é que a fábrica pode analisar o JSON e chamar o construtor com os parâmetros corretos. A classe do produto não precisa saber que foi criada devido à configuração JSON. Não é necessário saber se há JSON ou configuração envolvida.
2) O construtor do produto espera apenas um argumento, o objeto property_tree. Em seguida, ele pode analisar as informações necessárias. Se houver informações ausentes ou fora dos limites, cada classe de produto poderá reagir adequadamente. A fábrica não precisa saber quais argumentos são necessários para os vários produtos. A fábrica também não precisa saber como reagir em caso de configuração incorreta. E a interface do construtor é unificada e pequena. Mas, como desvantagem, o produto precisa extrair as informações necessárias do JSON, portanto, sabe como é construído.
Eu tendem a preferir a solução 2). No entanto, não tenho certeza se esse é um bom padrão de fábrica. De alguma forma, parece errado informar o produto que ele foi criado com a configuração JSON. Por outro lado, novos produtos podem ser introduzidos de maneira muito simples.
Alguma opinião sobre isso?