Rodrigo Allemand

DDD – Fabricando e Encontrando Objetos

por Rodrigo Allemand em Aug.17, 2009, como DDD

Antes de mais nada, este post não é – como nenhumk dos outros desta série – focado extritamente em DDD. Leia o primeiro post da séries para entender melhor…

Em qualquer sistema OO, vc trabalha com….. objetos (ohhhhhhhh)

Qualquer objeto ‘precisa’ ser….. criado antes de ser utilizado…. (ohhhhhhh)

Qual a melhor maneira de se criar objeto? (errr…. humm….. bem…….)

Muitas são as maneiras… usando um construtor, por DI (Dependency Injection), por fábricas, etc.

O mais utilizado são as fábricas, ou Factories conforme catalogado pelo GoF, ou Gang of Four.

Resumidamente, “o padrão Factory fornece uma interface para a criação de famílias de objetos correlatos ou dependentes sem a necessidade de especificar a classe concreta destes objetos”.

Diversos exemplos de fábricas existem espalhados pela internet, e eu não vou colocar mais um aqui. Procure, rs!

A motivação inicial do padrão era a criação de objetos complexos, fazendo com que a lógica estivesse toda em um unico lugar… princípio de DRY nos promórdios da Arquitetura de Software!

Porém, certos objetos alem de serem complexos, precisavam de um processo de construção demorado. Algumas tecnicas para a sulução deste problema era ‘reter’ o objeto contruido e utilizá-lo como um ponto de acesso único, otimizando assim o processo de construção.

Com isso, por muitas vezes os desenvolvedores juntavam dois padrões de projetos para sanar o problema de contrução complexa e demorada, utilizando Factory e ‘Singletons’ para colocar objetos a disposição do ‘domínio’.

Colocar fábricas a disposição dos desenvolvedores, por muitas vezes, mascarava onde realmente estes objetos deveriam ser criados. Poderiam existir inúmeras fábricas em um único projeto, como eu já presenciei num passado não muito distante. Era DaoFactory pra cá, AbstractDaoFactory pra lá, ReportFactory aqui e ServiceFactory acolá! Uma verdadeira macarronada de factories!

Então, como manter um ponto único de acesso para ‘encontrar’ os objetos?

Fowler resolveu colocar tudo em um unico padrão e o nomeou de Registry, ou Registro.

De acordo com Fowler, Registry é

Um objeto conhecido que outros objetos podem usar para encontrar objetos e serviços comuns.

A função do Registro é:

  1. Criar objetos
  2. Encapsular complexidades de criação
  3. Reter objetos criados
  4. Funcionar como ‘local dos objetos’

Com isso, se você quizer saber ou precisar de um objeto e o seu sistems tem um Registro, pergunte a ele!

Normalmente os Registros são factories e singletons mesclados, conforme o exemplo abaixo:

public MyDomainRegistry{
    private static MyDomainRegistry INSTANCE = null;

    private MyDomainRegistry(){
        loadVariables();
    }

    private static MyDomainRegistry instance(){
        //Coloque aqui a sua implementação de Singleton
        return INSTANCE;
    }

    //Posso usar SubDomains
    private ConsultarSubDomain consultarSubDomain;
    //Posso usar Services Services
    private ConversaoService conversaoService;
    //Qualquer objeto que eu queira localizar!
    private MyRepository myRepository;

    private void loadVariables(){
        //Aqui vc deve criar os seua objetos como achar melhor
        this.consultarSubDomain = new ConsultarSubDomain();
    }

    //Aqui vc coloca os métodos estáticos para retornar
    //os objetos que o registro precisa controlar
    public static ConsultarSubDomain consultarSubDomain() {
        return instance().consultarSubDomain;
    }
}

Bem simples, não?

Agora, para você utilizar um objeto, basta solicitar ao registro, assim.

public class FachadaDoDominio {

    private FachadaDoDominio() {
    }

    public static ConsultarSubDomain consultar(){
        return MyDomainRegistry.consultarSubDomain();
    }
}

Comente e Recomende!

:, , , ,
5 comentários para este post:
  1. Marcelo

    Tai !!!!
    Gostei desse padrão !!!
    Parabéns pelo blog !!!!

    []’s
    T+

  2. Zenas

    É verdade, é muito interessante e prático o Registry, mas fica uma dúvida minha, com a JSR-299-”Contexts and Dependency Injection for the JavaTM EE platform”, no caso DI citado no artigo, até que ponto eu devo utilizar a especificação ou criar o meu proprio registro, como escolher a melhor opção, no caso se existe isso, rs.

    Mas tb venho agradecer pelo artigo, é um artigo muito boa.

    Abraços.

  3. Rodrigo Allemand

    Não só com a chegada de (C)DI, mas antes, tambem, existiam varios artificios para tal, como Spring, PicoContainer, etc.
    Neste caso, é perfeitamente possivel usar DI dentro do Registry. Veja, o legal nete caso é ter todas as instâncias dentro de um único objeto, fácil de localizar dentro do projeto, deixando, ainda, a possibilidade de mudar de tecnologia (trocar o Spring pelo CDI, por exemplo) sem a necessidade de mexer muito no projeto.
    Lembre-se que se a DI fosse feita em cada classe que necessitasse de um determinado serviço, essa mudança seria um pouco mais custosa.

    Até!

  4. Zenas

    Mais uma coisa sobre o Registry, se eu estiver trabalhando com EJB 3.0 com JBOSS 4.2.1, nos vamos registrar os objetos distribuídos com a tecnologia JNDI ( InitialContext e os famosos rebind [servidor] e lookup[cliente] ), no caso nos devemos colocar o registro do servidor e das classes clientes em uma classe Registry, caso nos queiramos utilizar esses objetos em algum padrão como Facade. Como ficaria o registro nesse caso?

    Venho agradecer pelo ótimo artigo.

    Abraços

  5. Rodrigo Allemand

    Seria da mesma maneira do CDI…

Comente!

Procurando por algo?

Use o campo abaixo para procurar por todo o site:

Ainda não achou? Deixe um comentário ou me mande um email que eu cuido disso!

Minhas indicações!

Alguns blogs que eu recomendo...