Pergunta

Assim como o título pergunta, quando deve um gatilho em sua cabeça sair significando "Aha! Eu deveria usar o padrão de fábrica aqui!"? Acho esses momentos vão ocorrer com muitos outros padrões de projeto, mas nunca fazem-me parar e pensar sobre esse padrão.

Foi útil?

Solução

O padrão de fábrica é melhor empregado em situações em que você deseja encapsular a instanciação de um grupo de objetos dentro de um método.

Em outras palavras, se você tem um grupo de objetos que todos herdam a mesma classe base ou todos implementam a mesma interface que seria uma instância onde você iria querer usar o padrão de fábrica (que seria o "padrão" você procuraria).

Outras dicas

GoF :

Use o padrão Factory Method quando

  • uma classe não pode antecipar a classe de objetos que deve criar
  • uma classe quer suas subclasses para especificar o objeto que ele cria
  • classes de responsabilidade delegada a uma das várias subclasses auxiliares, e você deseja localizar o conhecimento de que ajudante subclasse é o delegado.

Eu recomendo o livro GoF. Ele tem uma seção sobre a aplicabilidade de cada um dos 23 padrões que abrange.

Sempre que você encontrar-se com o código que é algo como isto, você provavelmente deve estar usando uma fábrica:

IFoo obj;
if ( someCondition ) {
   obj = new RegularFoo();
} else if ( otherCondition ) {
   obj = new SpecialFoo();
} else {
   obj = new DefaultFoo();
}

Não consigo pensar em dois casos específicos que eu acho do padrão de fábrica:

  • Quando o construtor tem lógica nele.
  • Quando eu não quiser que o aplicativo se preocupar com o tipo é instanciado (por exemplo, eu tenho uma classe base abstrata ou interface que estou voltando).

Você está falando sobre Factory Method ou Abstract Factory?

O problema básico que tanto resolver está deixando os clientes especificar a classe exata que constrói código do framework. Por exemplo, se você fornecer uma interface, que os clientes podem implementar e, em seguida, em seu código tem algo como:

IMyInterface x = new ConcreteClass();

Não há nenhuma maneira para os clientes para alterar a classe exata que foi criado sem acesso a esse código.

A Factory Method é um método virtual que constrói uma classe concreta de uma interface específica. Clientes para o seu código pode fornecer um objeto que substitui esse método para escolher a classe que eles querem que você crie. Ele pode ter este aspecto em seu código:

IMyInterface x = factory.Create();

factory foi aprovada pelo cliente, e implementa uma interface que contém Create () -. Eles podem decidir a classe exata

Abstract Factory deve ser usado se você tem hierarquias de objetos relacionados e necessidade de ser capaz de escrever código que só fala com as interfaces base. Abstract Factory contém métodos múltiplas fábrica que criam um objeto específico concreto de cada hierarquia.

Design Patterns livro do Gang of Four, eles dão um exemplo de um labirinto com quartos, paredes e portas. código de cliente pode ter esta aparência:

IRoom r = mazeFactory.CreateRoom();
IWall nw = mazeFactory.CreateWall();
IWall sw = mazeFactory.CreateWall();
IWall ew = mazeFactory.CreateWall();
IWall ww = mazeFactory.CreateWall();
r.AddNorthWall(nw);
r.AddSouthWall(sw);
r.AddEastWall(ew);
r.AddWestWall(ww);

(e assim por diante)

As paredes de concreto exatas, os quartos, as portas podem ser decididas pelo implementador de MazeFactory, que iria implementar uma interface que você fornecer (IMazeFactory).

Então, se você está fornecendo interfaces ou classes abstratas, que você espera que outras pessoas para implementar e fornecer - fábricas, em seguida, são uma maneira para que eles também fornecem uma maneira para o seu código para construir suas classes concretas quando você precisar deles.

As fábricas são muito usados ??em localização, onde você tem uma tela com diferentes layouts, prompts e olhar / sensação para cada mercado. Você começa a tela de fábrica para criar uma tela com base no seu idioma, e cria a subclasse apropriada com base no seu parâmetro.

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