Para demonstrar esse padrão primeiro preciso apresentar "o problema":
Primeiro vamos criar um projeto Console Application
Vamos criar uma classe abstrata chamada DBConnection
Em seguida criar um método abstrato Open();
Em seguida vamos criar uma classe SQLConnection implementando a classe abstrata DBConnection.
Em seguida sobrescrevemos o método Open() como na imagem abaixo.
Agora vamos criar uma outra classe abstrata chamada DBCommand.
E incluir um método abstrato Execute().
Agora criamos uma classe SQLCommand implementando a classe abstrata DBCommand
Em seguida sobrescrevemos o método Execute como na imagem abaixo.
Agora vamos utilizar as nossas classes SQLConnection e SQLCommand em nosso programa.
O resultado final é :
Bom perceba que temos um grande problema aqui, estamos totalmente acoplados nas classes SQLConnection e SQLCommand, caso precisemos trocar o nosso banco de dados para ORACLE, termos que trocar todos os nossos objetos de nosso projeto e suas utilizações.
Para resolver isso vamos utilizar o padrão Abstract Factory, onde teremos uma "fábrica" que vai criar os objetos e devolver somente a instancia de acordo com a fábrica utilizada.
Vamos implementar o padrão.
Primeiro criamos uma classe abstrata DBFactory
Nela adicionamos dois métodos, o createConnection e o CreateCommand,
Perceba que o método abstrato createConnection retorna um DBConnection, ou seja, poderá retornar qualquer objeto que implemente essa classe
E a mesma situação para o método createCommand.
Agora criamos a nossa fabrica para a família de objetos SQL.
Nela implementamos a classe abstrata DBFactory.
E em seguida sobrescrevemos os métodos createConnection e createCommand.
O método createConnection retorna uma instancia da classe SQLConnection, e o método createCommand retorna uma instancia da classe SQLCommand.
Nosso diagrama de classe ficou da seguinte maneira.
Agora vamos alterar o nosso programa principal para utilizar a fabrica.
Perceba que agora não criamos a Instancia da classe SQLCommand ou SQLConnection, quem faz isso é a Factory.
Criei as mesmas classes para o ORACLE para ilustrar a facilidade que teremos para modificar a conexão com o banco de dados.
Perceba na imagem abaixo que a única coisa que mudou em nosso código foi a instancia da classe OracleFactory().
Com isso deixamos o sistema escalável e de fácil manutenção, sem falar no baixo nível de acoplamento, pois o programa cliente não sabre o que é o SQL ou ORACLE , apenas utiliza.
Galera por hoje é isso, peque aqui o projeto completo.
Espero que tenham gostado e até a próxima.
-- Lucas 6:37 - 38