Design Pattners

olá,
Estou estudando os padroes GoF, mas duvida eh como aplicar os padrões em aplicações propriamente ditas.
por exemplo em um aplicação tenho q criar 3 classes para acesso a dos uma cada tipo de base db2,oracle e mysql ai vem duvida posso usar Abstract Factory ou devo usar Singleton ?
Como saber qual usar?

Grato.

Antes de mais nada você precisa entender o problema que precisa ser resolvido. Nesse caso, nenhum dos padrões que você citou resolve o seu problema.

Como diria o ditado:

“A problem well stated is a problem half solved.”

eh?

Veja bem, até então a única coisa que você enunciou foi o seguinte:

Ora, criar uma classe para cada tipo de base de dados já resolve esse problema!

Antes de pensar em quais padrões devem ser usados, você tem que entender muito bem o problema a ser resolvido. Em boa parte do tempo, inclusive, acaba-se desenvolvendo uma solução ad-hoc que acaba sendo refatorada para algum padrão de projeto.

Enfim, para dar prosseguimento, seria interessante definir o que essas classes devem fazer. Enfim, o que exatamente você quer dizer com uma “classe para acessar dados” ?

Sabe oq é ETL ?
então estou desenvolvendo as classes que conectam no bando de dados e nao será so uma banco como eu ja havia dito antes e sim abstract factory tem uso sim faria uma fabrica de concexões que o produto seria o objeto connction em si

[quote=JJjava]Sabe oq é ETL ?
então estou desenvolvendo as classes que conectam no bando de dados e nao será so uma banco como eu ja havia dito antes e sim abstract factory tem uso sim faria uma fabrica de concexões que o produto seria o objeto connction em si
[/quote]

Eu não disse que a AbstractFactory não tem uso. O que eu disse é que esse padrão não resolve o problema que você postou.

Na prática, para resolver um problema complexo você aplica vários padrões em conjunto. Porém, no processo para encontrar a solução mais adequada é necessário analisar o problema, quebrar um problema grande em problemas menores e aplicar os padrões corretos em cada um destes problemas menores.

Esse caso das conexões é um exemplo de que você não está fazendo essa análise. Você não precisa criar uma AbstractFactory (um padrão de criação) para criar as conexões. Você já tem o DriverManager pra fazer isso. Tanto é assim que o tipo que ele retorna é um tipo abstrato (Connection), sendo que cada driver de banco tem um tipo específico de conexões.

Enfim, sem entender exatamente qual é o problema, tentar aplicar padrões te leva aos anti-padrões, que acabam dificultando ainda mais a implementação e a manutenção do seu código.

[quote=rmendes08][quote=JJjava]Sabe oq é ETL ?
então estou desenvolvendo as classes que conectam no bando de dados e nao será so uma banco como eu ja havia dito antes e sim abstract factory tem uso sim faria uma fabrica de concexões que o produto seria o objeto connction em si
[/quote]

Eu não disse que a AbstractFactory não tem uso. O que eu disse é que esse padrão não resolve o problema que você postou.

Na prática, para resolver um problema complexo você aplica vários padrões em conjunto. Porém, no processo para encontrar a solução mais adequada é necessário analisar o problema, quebrar um problema grande em problemas menores e aplicar os padrões corretos em cada um destes problemas menores.

Esse caso das conexões é um exemplo de que você não está fazendo essa análise. Você não precisa criar uma AbstractFactory (um padrão de criação) para criar as conexões. Você já tem o DriverManager pra fazer isso. Tanto é assim que o tipo que ele retorna é um tipo abstrato (Connection), sendo que cada driver de banco tem um tipo específico de conexões.

Enfim, sem entender exatamente qual é o problema, tentar aplicar padrões te leva aos anti-padrões, que acabam dificultando ainda mais a implementação e a manutenção do seu código.[/quote]
se vc diz…

Já pensou em usar uma ferramenta própria pra ETLs como o Pentaho Data Integration (Kettle) ou afins?

Quanto ao uso dos patterns, concordo com o que o rmendes08 mencionou. Os patterns sempre precisam ser adaptados pra se encaixarem na sua solução. Você precisa identificar se algum pattern é aplicável àquele problema e tornaria a solução mais simples. Não adianta querer forçar o uso de um pattern simplesmente por utilizar…

Recentemente ouvi de um instrutor no curso que estou fazendo: “A otimização prematura é a raiz de todo o mal”.

Boa sorte