5
respostas

Este é um exemplo de Strategry e/ou Factory Method?

Tenho o seguinte cenário:

Preciso consultar diversos termos no Google, mas como ele detecta quando um robô faz isso, utilizo diversos serviços de proxy.

No construtor da minha classe BuscaResultadosGoogle, recebo um objeto que implementa a interface GoogleProxy, que tem um método getHttpService($url), que me retorna um HttpService configurado com o que o proxy precisa (alguns proxies precisam de mais parâmetros, outros de menos...).

O código é o seguinte:

public function __construct($palavraChave, GoogleProxy $proxy = null)
{
    if (is_null($proxy)) $proxy = new SemProxy();

    $palavraChave = preg_replace('/\s/', '+', $palavraChave);
    $url = "http://www.google.com.br/search?q=$palavraChave&num=100&cr=countryBR";

    $this->http = $proxy->getHttpService($url);
}

Quando recebo um objeto que pode realizar uma função sem que eu saiba qual é, evitando assim diversos ifs ou cases de um switch, o padrão é o Strategy. E quando tenho um método que cria um objeto complexo, o padrão é o Factory Method. No meu caso, tenho os dois. Sendo assim, os dois padrões estão sendo aplicados corretamente?

Abraços e obrigado.

5 respostas

Oi Carlos, tudo bom?

É complicado reduzir um pattern a uma consequencia especifica no código. O padrão factory realmente serve para auxiliar a construção de objetos complexos, mas não é qualquer método que retorna um objeto complexo que pode ser considerado uma factory. Entretanto, no nosso caso não temos um método e sim um construtor! Note que um construtor e um método são abordagens diferentes. Um construtor não possui especificação de retorno, um método sim. Entre outras peculiaridades.

A mesma ideia se repete para o padrão Strategy. Não é sempre que evitamos operadores condicionais no código que estamos implementando o pattern. Nesse caso, estamos trabalhando com polimorfismo em cima da interface GoogleProxy.

Espero ter ajudado!

Abraço e bons estudos.

Oi Carlos, tudo bem ?

O lance do Strategy é que você consegue agora trocar o seu objeto e não precisa fazer outro método para isso, reduzindo o número de if, else, switch.

O padrão Factory, você tem que pensar numa empresa de produção, onde entra apenas a matéria prima e sai com o produto final, onde todo o processo de confecção é abstraído, mas sim toda a regra complexa fica encapsulada.

Abraços

André, o Factory Method não é meu construtor. É o getHttpService. Quanto ao Strategy, polimorfismo é o recurso utilizado pra implementá-lo. Por que nao seria o caso no meu exemplo?

Abraços e obrigado!

Então, Matheus. O conceito dos patterns estão bem claros pra mim. A dúvida é se eles foram aplicados corretamente no meu exemplo.

Abraços e obrigado!

Depois de um pouco mais de estudo, vi que a definição do padrão é:

Dada uma interface para criação de algum objeto, as classes que a implementam devem decidir qual objeto criar.

Levando isso em conta, meu método getHttpService() é sim um Factory Method, pois embora ele sempre retorne um objeto do mesmo tipo, são as classes concretas que implementam a interface GoogleProxy (que é minha interface de factory) que decidem como instanciá-lo.

Porém o exemplo do curso não, já que o método getConnection() sempre retorna o mesmo objeto, com os mesmos dados.

É isso mesmo?