Nota: as perguntas estão no final da postagem.
Eu li os outros threads de stackoverflow sobre Abstract Factory vs Factory Method . Eu entendo a intenção de cada padrão. No entanto, não estou claro sobre a definição.
O Método de Fábrica define uma interface para criar um objeto, mas permite que as subclasses decidam quais delas serão instanciadas. Um método de fábrica permite que as classes adiem a instanciação para subclasses.
Por outro lado, um Abstract Factory fornece uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas.
A Fábrica Abstrata é muito parecida com o Método de Fábrica . Eu desenhei algumas classes UML para ilustrar meu argumento.
Nota:
- O diagrama é de www.yuml.com, portanto, não estão perfeitamente orientados. Mas é um serviço gratuito :).
- Os diagramas podem não ser perfeitos. Ainda estou aprendendo os padrões de design do GoF .
Método de fábrica:
Fábrica abstrata (apenas 1 membro):
Fábrica abstrata (mais membros):
Questões:
- Se a Abstract Factory tem apenas um criador e um produto, ainda é o padrão da Abstract Factory ? (uma interface para criar famílias)
- O criador concreto do Método de Fábrica pode ser criado a partir de uma Interface ou precisa ser de uma classe? (as classes adiam instanciações para subclasses)
- Se a Abstract Factory pode ter apenas um criador e um produto, a única diferença entre a Abstract Factory e o Factory Method é que o criador do primeiro é uma interface e o criador do último é uma classe?
Respostas:
Espero que isto ajude. Descreve os vários tipos de fábricas. Eu usei Head First Design Patterns como minha referência. Eu usei o yuml.me para fazer o diagrama.
Fábrica estática
É uma classe com um método estático para produzir vários subtipos de produtos.
Fábrica Simples
É uma classe que pode produzir vários subtipos de produto. (É melhor que a Static Factory. Quando novos tipos são adicionados, a classe base do produto não precisa ser alterada apenas a classe Simple Factory)
Método de fábrica
Contém um método para produzir um tipo de produto relacionado ao seu tipo. (É melhor que uma Fábrica Simples, porque o tipo é adiado para uma subclasse.)
Fábrica abstrata
Produz uma família de tipos relacionados. É visivelmente diferente de um Método de Fábrica, pois possui mais de um método de tipos que produz. (Isso é complicado, consulte o próximo diagrama para obter um exemplo melhor da vida real).
Exemplo do .NET Framework
DbFactoriesProvider é uma Fábrica Simples, pois não possui subtipos. O DbFactoryProvider é uma fábrica abstrata, pois pode criar vários objetos de banco de dados relacionados, como objetos de conexão e comando.
O que outras pessoas estão dizendo
fonte
Product
(como um resumo), e entãoProduct1
eProduct2
, como filhos? Isso ajudaria a afirmar que o Método de Fábrica é apenas criar um produto, enquanto o Abstract Factory é mais ou menos um monte de Métodos de Fábrica reunidos em famílias.Os dois padrões estão certamente relacionados!
A diferença entre os padrões geralmente é intencional.
A intenção do Factory Method é "Definir uma interface para criar um objeto, mas deixe as subclasses decidirem qual classe instanciar. O Factory Method permite que uma classe adie a instanciação para subclasses".
A intenção do Abstract Factory é "Fornecer uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas".
Baseado puramente nessas declarações de intenção (citadas no GoF), eu diria que, de fato, o Método Fábrica é, em certo sentido, uma Fábrica Abstrata "degenerada" com uma família de um.
Eles geralmente tendem a diferir na implementação, pois o Método de Fábrica é muito mais simples que o Abstract Factory .
No entanto, eles também estão relacionados à implementação. Conforme observado no livro do GoF,
Este wiki c2 também tem uma discussão interessante sobre esse tópico.
fonte
Parece que a lista de perguntas (excelentes) do OP foi ignorada. As respostas atuais meramente oferecem definições reformuladas. Por isso, tentarei abordar as questões originais de forma concisa.
Não . Uma Fábrica Abstrata deve criar mais de um produto para criar uma "família de produtos relacionados". O exemplo canônico do GoF cria
ScrollBar()
eWindow()
. A vantagem (e a finalidade) é que a Abstract Factory pode aplicar um tema comum em seus múltiplos produtos.Primeiro, devemos observar que nem Java nem C # existiam quando o GoF escreveu seu livro. O uso GoF do termo interface não está relacionado aos tipos de interface introduzidos por idiomas específicos. Portanto, o criador concreto pode ser criado a partir de qualquer API. O ponto importante no padrão é que a API consome seu próprio Método de Fábrica, portanto, uma interface com apenas um método não pode ser um Método de Fábrica mais do que uma Fábrica Abstrata.
Esta pergunta não é mais válida, seguindo as respostas acima; no entanto, se você continuar pensando que a única diferença entre o Abstract Factory e o Factory Method é o número de produtos criados, considere como um cliente consome cada um desses padrões. Uma fábrica abstrata é normalmente injetada em seu cliente e invocada por meio de composição / delegação. Um método de fábrica deve ser herdado. Então, tudo volta ao antigo debate sobre composição versus herança.
Mas essas respostas levantaram uma quarta pergunta!
Se o método for estático, normalmente é chamado de Static Factory . Se o método não for estático, geralmente é chamado de Fábrica Simples . Nenhum deles é um padrão GoF, mas na prática eles são muito mais usados!
fonte
Na minha opinião, a ligeira diferença entre os dois padrões reside na aplicabilidade e, como já foi dito, no Intent .
Vamos recapitular as definições (ambas da Wikipedia).
Fábrica abstrata
Método de fábrica
Ambos os padrões permitem dissociar os objetos do usuário da criação de instâncias necessárias (dissociação em tempo de execução), e esse é o aspecto comum. Ambos os padrões permitem criar uma hierarquia de fábricas de acordo com quaisquer necessidades específicas, e esse é outro aspecto comum.
Abstract Factory permite criar vários tipos diferentes de instâncias em uma subclasse e particularizar o comportamento das criações em suas diferentes subclasses; normalmente, o método Factory declara a criação de apenas um tipo de objeto que pode ser particularizado de acordo com o mecanismo de subclassificação. Essa é a diferença.
Resumindo. Digamos que Product defina a superclasse dos objetos de criação e que ProductA e ProductB são duas subclasses diferentes. Portanto, o método Abstract Factory terá dois métodos, createProductA () e createProductB (), que serão particulares (em termos de etapas de criação) em suas subclasses específicas: as subclasses de factory especificam as etapas de criação para as duas classes definidas de objetos em criação.
De acordo com o exemplo acima, o Método de Fábrica será implementado de maneira diferente, abstraindo a criação do Produto A e do Produto B em tantas fábricas (um método por Fábrica), e a especialização adicional das etapas de criação será delegada na hierarquia à medida que for criada .
fonte
Se eu criasse uma classe Factory abstraída (referenciada por meio de uma interface ou classe base abstrata) que crie objetos que possuam apenas um método para criar objetos, seria um método Factory .
Se a Fábrica abstraída tivesse mais de um método para criar objetos, seria uma Fábrica Abstrata .
Digamos que eu crie um gerente que lide com as necessidades dos métodos de ação de um controlador MVC. Se houvesse um método, digamos, para criar os objetos de mecanismo que serão usados para criar modelos de vista, seria um padrão de método de fábrica. Por outro lado, se houvesse dois métodos: um para criar mecanismos de modelo de exibição e outro para criar mecanismos de modelo de ação (ou o que você quiser chamar de modelo que o método de ação contém consumidores), seria uma fábrica abstrata.
fonte
Embora já se passaram muitos anos desde que as pessoas do StackOverflow questionaram esse problema da mesma forma em outras postagens (a mais antiga vai até 2009), ainda não consegui encontrar a resposta que queria.
Então, eu fiz algumas horas pesquisando na web, revisando os exemplos e cheguei a essa conclusão, as principais diferenças entre o Abstract Factory e o Factory Method são
Os exemplos contrários seriam
Portanto, quando um grupo de objetos final deve ter o mesmo estilo sem uma exceção de um objeto e você deseja ocultar esse detalhe "mantendo o mesmo estilo", devemos usar o Abstract Factory.
fonte
Tanto quanto eu entendo o significado de Fábrica abstrata e definições de método Factory, a primeira é implementada em contexto estático e fornece objeto com base em parâmetros de entrada.
O segundo usa o objeto já criado (a família) que implementa a interface do método de fábrica. O método de fábrica cria uma instância específica relacionada ao objeto original, independentemente de qual seja.
Portanto, isso geralmente leva ao uso dos dois padrões juntos, onde na primeira etapa você cria algum objeto geral que descreve a família de objetos relacionados. É chamado pelo método estático getInstance ("nome da minha família"). A implementação desse método getInstance decide qual objeto de família será criado.
Então chamo o método createProduct () no objeto de família recém-criado e, dependendo do objeto de família, o novo produto será retornado.
Parece que esses padrões cooperam para cada um.
Em outras palavras, a Abstract Factory está focada em "O QUE" será criado e o método de fábrica "COMO" será criado.
fonte
Tudo o que você precisa lembrar é que uma fábrica abstrata é uma fábrica que pode devolver várias fábricas . Portanto, se você tiver um AnimalSpeciesFactory, poderá retornar fábricas como esta:
Mamalfactory, BirdFactory, Fishfactory, ReptileFactory. Agora que você possui uma única fábrica da AnimalSpeciesFactory, eles usam o padrão de fábrica para criar objetos específicos. Por exemplo, imagine que você tenha um ReptileFactory desse AnimalFactory, e poderá oferecer objetos para répteis como: Cobras, tartarugas, objetos de lagartos.
fonte
fonte
O padrão de método de fábrica é um padrão de design criacional que lida com a criação de objetos sem mostrar a classe exata de objeto que está sendo criado. Esse padrão de design basicamente permite que uma classe adie a instanciação para subclasses.
O padrão Abstract Factory serve para encapsular um grupo de fábricas individuais sem expor as classes concretas. Nesse modelo, uma interface genérica de uma classe abstrata de fábrica é usada para criar o objeto concreto necessário, separando os detalhes da implementação de objetos de seu uso e composição. Esse padrão de design é amplamente usado em aplicativos de GUI em que tipos semelhantes de componentes da GUI precisam ser criados.
enquanto pesquisava no google, vim seguindo o blog, que explicava os dois padrões de design de maneira brilhante. dê uma olhada neles
http://simpletechtalks.com/factory-design-pattern/
http://simpletechtalks.com/abstract-factory-design-pattern/
fonte