Semelhanças e diferenças entre os dois:
Método de modelo
- Confia na herança.
- Define as etapas de um algoritmo e deixa a tarefa de implementá-las nas subclasses.
Método de fábrica
- Confia na herança.
- Uma superclasse define uma interface para criar um objeto. As subclasses decidem qual classe concreta instanciar.
Os dois lado a lado:
Não sei ao certo o que a frase "Método de Fábrica é uma especialização de Método de Modelo" (está no livro Head First Design Patterns ). Em Beverage
nós temos o método prepare
que é final
e define uma série de etapas. Em PizzaStore
nós temos um método que é abstract
, e subclasses o redefinem. Como o último é uma especialização do primeiro?
design-patterns
object-oriented-design
factory-method
template-method
Maria Ines Parnisari
fonte
fonte
Respostas:
Em
Beverage
nós temos o método ("template")prepare
que chama alguns métodos abstratos comoboilWater
,brew
etc. , que são implementados nas subclasses. Não é essencialmente para o padrão ter o método de modelo localizado na classe base, ele pode estar em qualquer outro lugar, desde que os métodos abstratos sejam públicos. Mas é essencialmente que existem os métodos abstratos que devem ser substituídos e preencherão as lacunas no "modelo de algoritmo".O método factory também é sobre uma classe na qual os métodos abstratos são substituídos; um ponto principal é que o chamador desse método não precisa saber o tipo exato do objeto criado. Note que em
PizzaStore
, o método abstratocreatePizza
deve ser chamado em algum lugar de - digamos um métodocreateLotsOfPizza
.Isso o torna um método de modelo, onde as etapas específicas do "algoritmo para criar pizzas" são as lacunas a serem preenchidas. Agora é provavelmente apenas um uso impreciso de palavras, dizendo "o padrão de método de fábrica" é um caso especial do padrão "método de modelo". Especialmente os "métodos de fábrica" não são "métodos de modelo", no entanto, eles podem ser chamados de um método de modelo. Para ser mais preciso, podemos dizer
e acho que é isso que os autores desse livro querem expressar.
fonte
Eu acho que "Factory Method é uma especialização do Template Method" é uma má caracterização. Acredito que seria mais preciso dizer que o padrão do Método do Modelo é apenas uma variação do padrão do Método da Fábrica.
Além disso, afirmo que o padrão do Método do Modelo não é realmente um padrão (no sentido da Gangue dos Quatro), uma vez que surge naturalmente através da herança e da substituição do método. Você pode ver que, no diagrama acima para o Modelo Padrão, as classes descendentes simplesmente substituem os métodos na classe base por seu próprio comportamento.
No geral, os Padrões de Software (da variedade Gang of Four) são realmente apenas soluções alternativas para deficiências nas linguagens de programação, e o Template Template apenas reafirma de que linguagens orientadas a objetos já são nativamente capazes.
fonte
Eu diria que o Head First está simplesmente errado nessa caracterização.
A Wikipedia define o Método do modelo como:
(Faz referência ao GoF para isso.)
E o Método de Fábrica é definido como:
Não há sobreposição entre os dois, exceto que em C ++, a herança é uma parte essencial de ambos. No entanto, em linguagens que fazem uma distinção entre herança de implementação (
extends
em Java) e implementação de interface (implements
em Java), mesmo essa semelhança não existe, pois a implementação da interface é suficiente para o método de fábrica, mas não para o modelo. E em C ++, a herança pura de implementação (sem a herança da interface, ou seja, herança privada ou CRTP) pode ser usada para o primeiro, mas não para o último.E além disso? Um é um padrão de design comportamental, o outro é um padrão criacional. Um descreve um esboço de uma operação, com algumas partes importantes deixadas de fora para serem preenchidas por subclasses especializadas; o outro especifica um contrato muito simples, deixando toda a implementação para instâncias concretas. Eles são completamente distintos.
Na minha opinião, a linha citada está simplesmente errada. Ou é um erro gritante no livro ou (menos provável) está fora de contexto e deve ser interpretado de maneira diferente.
fonte