Pergunta

Qualquer um pode explicar a diferença entre os padrões de fábrica e estratégia?

Para mim ambos estão olhando mesmo que não seja uma classe de fábrica adicional (que criar um objeto de produto nos padrões de fábrica)

Foi útil?

Solução

Um teste padrão de fábrica é um padrão criacional. Um padrão de estratégia é um padrão operacional. Dito de outra forma, um padrão de fábrica é usada para criar objetos de um tipo específico. Um padrão de estratégia é a utilização para executar uma operação (ou um conjunto de operações) de uma maneira particular. No exemplo clássico, uma fábrica pode criar diferentes tipos de animais: cão, gato, tigre, enquanto um padrão de estratégia iria realizar ações específicas, por exemplo, mover; utilizando estratégias de correr, caminhar, ou Lope.

Na verdade os dois podem ser usados ??juntos. Por exemplo, você pode ter uma fábrica que cria seus objetos de negócios. Ele pode usar diferentes estratégias baseadas na média persistência. Se seus dados são armazenados localmente em XML que usaria uma estratégia. Se os dados eram remotas em um banco de dados diferente, ele iria usar outro.

Outras dicas

O padrão de estratégia permite que você mude o comportamento polymorphically de uma classe.

O padrão de fábrica permite a criação de objetos encapsular.

Gary faz um grande ponto. Se você estiver usando o princípio da codificação para abstrações em vez de "concreções", em seguida, uma série de padrões começa parecendo variações sobre um tema.

Apenas a acrescentar ao que tvanfosson disse, muitos dos padrões têm a mesma aparência, tanto quanto a implementação. Ou seja, muito tem de criar uma interface onde talvez não havia um antes em seu código, e em seguida, criar um monte de implementações de interface. A diferença está no seu propósito e como eles são usados.

  • A Fábrica (método) Padrão.

Criar instâncias concretas apenas. Diferentes argumentos podem resultar em diferentes objetos. Depende da lógica etc.

  • O padrão de estratégia.

encapsular o algoritmo (passos) para executar uma ação. Então você pode mudar a estratégia e usar outro algoritmo.

Embora ambos olhar como muito semelhantes, o objetivo é um pouco diferente, um propósito é criar o outro é para executar uma ação.

Então. Se o seu método de fábrica é fixo, você pode tê-lo como este:

 public Command getCommand( int operatingSystem ) { 
      switch( operatingSystem ) { 
           case UNIX    :
           case LINUX   : return new UnixCommand();
           case WINDOWS : return new WindowsCommand();
           case OSX     : return new OSXCommand();
       }
  }
criação

Mas suponha que suas necessidades de fábrica mais avançada ou dinâmico. Você pode adicionar o método de fábrica uma estratégia e alterá-lo sem ter que recompilar, a estratégia pode mudar em tempo de execução.

Em primeiro lugar diferença que um entre a fábrica simples e fábrica de resumo deve ser feita. A primeira delas é uma fábrica simples, onde você só tem uma classe que age como uma fábrica para a criação do objeto, enquanto no segundo você se conecta a uma interface de fábrica (que define os nomes de métodos) e, em seguida, chamar as diferentes fábricas que implementam esta interface que é suposto ter diferentes implementações do mesmo método com base em alguns critérios. Por exemplo, temos uma interface ButtonCreationFactory, que é implementado por duas fábricas, a primeira WindowsButtonCreationFactory (cria botões com o Windows look and feel) eo segundo LinuxButtonCreationFactory (cria botões com Linux look and feel). Assim, tanto essas fábricas têm o mesmo método de criação com diferentes implementações (algoritmos). Você pode fazer referência a isso em tempo de execução com base no método que você tipo de botão que você deseja.

Por exemplo, se você quiser botões com Linux look and feel:

ButtonCreationFactory myFactory = new LinuxButtonCreationFactory();
Button button1 = myFactory.createButton(...);

ou se você deseja que o Windows botões

ButtonCreationFactory myFactory = new WindowsButtonCreationFactory();
Button button1 = myFactory.createButton(...);

Mesmo neste caso, que resulta em uma espécie de padrão de estratégia, já que diferencia algoritmos para fazer alguma criação. No entanto, difere dele semanticamente porque é usado para a criação OBJECTO em vez de algoritmos operacionais. Então, basicamente com fábrica abstrata você tem a criação do objeto usando estratégias diferentes, o que torna muito semelhante ao padrão de estratégia. No entanto, o AbstractFactory é criacional, enquanto o padrão Strategy está operacional. Implementação sábio, eles resultam ser o mesmo.

Factory (e FactoryMethod retornado pela Factory) :

  1. padrão Criacionais
  2. Com base na herança
  3. fábrica retorna um Factory Method (interface) que por sua vez retorna Concrete objeto
  4. Você pode substituir novos objetos concretos para interface e cliente (chamador) não deve estar ciente de todas as implementações concretas
  5. A interface do cliente sempre acesso apenas e você pode ocultar os detalhes de criação de objeto no método de fábrica

Tenha uma olhada neste artigo wikipedia e artigo javarevisited

padrão Strategy:

  1. É um padrão de comportamento
  2. É baseado na delegação
  3. muda entranhas do objeto por modificar o comportamento método
  4. É usado para alternar entre a família de algoritmos
  5. Ele altera o comportamento do objeto em tempo de execução

Exemplo:

Você pode configurar uma estratégia de desconto para um item específico (bilhete de passagem ou item ShoppingCart). Neste exemplo, você vai oferecer 25% de desconto para um item durante julho - dezembro e Nenhum desconto no item durante Jaunary -. Junho

Related posts:

real Exemplo Mundial do padrão de estratégia

Design Patterns: Fábrica vs método de fábrica vs Abstract Factory

padrão Strategy, em termos simples é mais da criação de tempo de execução do comportamento onde você não está preocupado com a classe de implementação. Por outro fábrica teve é ??a criação de tempo de execução de instância de classe concreta e cabe a você usar qualquer comportamento (método) exposta pela interface implementada.

Para estender sobre o que Oscar dito e em referência ao seu código:

O getCommand é a fábrica e as classes UnixCommand, WindowsCommand e OSXCommand são estratégias

Talvez eu discordo com o Oscar em que o seu exemplo de uma implementação de fábrica é bastante fortemente acoplados e muito fechado, não admira que a sua escolha é padrão Strategy. implementação A fábrica não deve depender de qualquer número fixo de classes específicas a ser instanciado, por exemplo:

public Command getCommand( int operatingSystem ) {        
   return commandTable.get(operatingSystem); 
}

...

public class WindowsCommand implements Command {
    ...
    static {
        CommandTable.getInstance().registerCommand(WIN_COMMAND_ID, new WindowsCommand());
    }

}

Eu acho que os critérios mais adequados para escolher um ou outro é principalmente os termos que você empregar para nomear suas classes e métodos, tendo em conta tudo o que deve tender para o programa às interfaces e não às aulas e também foco no objetivo: nós visam determinar qual código será executado em tempo de execução. Dito isto, podemos alcançar o objetivo, usando qualquer um dos dois padrões.

Estratégia e Fábrica são diferentes fins. Na estratégia tem o foco definido, usando este padrão que você pode trocar o comportamento (algoritmos). Vindo para Fábrica existem muitas variações ao redor. Mas o padrão original do GO4 afirma folhas fábrica criação de objeto a classe filha. Aqui com a fábrica está a substituir instância completa não o comportamento que você está interessado. Por isso, você estará substituindo sistema completo não o algoritmo.

Você não pode entender a diferença simplesmente por olhar para o código ou categorização. Para compreender os padrões GoF corretamente, olhar para os seus intentos:

Estratégia: ". Definir uma família de algoritmos, encapsular cada um, e torná-los intercambiáveis ??Strategy permite que o algoritmo variar independentemente dos clientes que a utilizam"

Factory Method: ". Definir uma interface para criar um objeto, mas deixa as subclasses decidirem qual classe instanciar Factory Method permite a instanciação de classe adiar a subclasses"

E aqui está uma explicação elaborada sobre as intenções e as diferenças entre estes dois padrões: Diferença entre padrões de projeto Factory Method e Estratégia

padrão de fábrica é um padrão creacional, que é criada com as propriedades especificadas (comportamento). enquanto que em tempo de execução após a criação u cn't alterar suas propriedades (comportamento). por isso, se vc precisar de propriedades diferentes (comportamento) u tem que excluir o objeto e criar novo objeto com propriedades necessárias (comportamento). que não é a GUD. enquanto no caso de padrão de estratégia u pode alterar as propriedades (comportamento) em tempo de execução.

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