VB.NET - Design Patterns - Factory


Estou voltando ao assunto Design Patterns. Quando digo que estou voltando é porque já tratei do assunto nos artigos:

 

1- Padrões de Projeto - Design Patterns

2- Padrões de Projeto : O modelo MVC - Model View  Controller

 

Os padrões de projeto não devem ser visto como a salvação universal para o problema do desenvolvimento de software nem ser posto de lado como uma coisa inútil que não serve para nada. Eles apenas fornecem uma relação de soluções comuns que são usadas no mundo real das aplicações comerciais, soluções que já foram provadas e aprovadas em diferentes projetos de software.

 

Conhecer os padrões de projeto pode ser muito interessante mas saber como aplicá-los aos seus projetos é que realmente vai fazer a diferença.

Podemos considerar que a ideia original de Design Patterns surgiu com Christopher Alexander quando ele propôs a criação de catálogos de padrões para arquitetura.(Ele era Engenheiro Civil). Suas publicações a respeito foram:

Com a palavra Christopher Alexander :

"Um padrão descreve um problema que ocorre inúmeras\par vezes em determinado contexto, e descreve ainda a solução para esse problema, de modo que essa solução possa ser utilizada sistematicamente em distintas situações." [Alexander78]

A seguir algumas definições para o assunto encontradas na internet:

Padrões de projeto são soluções elegantes e reutilizáveis para problemas recorrentes que encontramos diariamente no processo de desenvolvimento de aplicativos para o mundo real. Eles tratam da concepção e da interação entre objetos, definindo ao mesmo tempo um padrão de comunicação que é compartilhado por toda a equipe de desenvolvimento. http://www.oodesign.com.br/patterns/

Um padrão de projeto é uma estrutura recorrente no projeto de software orientado a objetos. Pelo fato de ser recorrente, vale a pena que seja documentada e estudada. http://s2i.das.ufsc.br/seminarios/apresentacoes/padroes_de_projeto/text3.html

Um padrão de projeto sistematicamente nomeia, motiva e explica um projeto genérico, que endereça um problema de projeto recorrente em sistemas orientados a objetos. Ele descreve o problema, a solução, quando é aplicável e quais as conseqüências de seu uso.”http://www.javacampinas.com.br/palestras/IntrodPadroesComJava.ppt

Essas soluções são desenvolvidas e conhecidas por especialistas, e tornam-se padrões por serem reutilizadas várias vezes em vários projetos e por terem a sua eficácia comprovada.

Este artigo vai se ater ao padrão Factory

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.

Por exemplo , quando estamos trabalhando com uma interface e temos mais de uma implementação para esta interface, podemos utilizar uma fábrica para criar um objeto que implementa a interface; a fábrica pode selecionar a implementação que ela retorna.

A utilização do padrão Factory é útil quando você precisa criar objetos dinamicamente sem conhecer a classe de implementação, somente sua interface: o padrão factory estabelece uma forma de desenvolver objetos que são responsáveis pela criação de outros objetos.
 

Vejamos um exemplo prático:

 

No exemplo a seguir temos uma interface que define o método falaAlo().  Precisamos criar objetos AloFactory e usando o padrão Factory criamos facilmente objetos de forma dinâmica sem conhecer a classe de implementação.

 

1-) A interface IAloMundo que define o método falaAlo()

Public Interface IAloMundo

 Sub falaAlo()

End Interface

 

2-) A classe EnglishAloMundo que implementa a interface IAloMundo

Public Class EnglishAloMundo
                    Implements IAloMundo

 Public Sub falaAlo()
   System.Console.WriteLine(" Hello World")
 End Sub

End Class

 

3-) A classe SpanishAloMundo que implementa a interface IAloMundo

Public Class SpanishAloMundo
             Implements IAloMundo

 Public Sub falaAlo()
   System.Console.WriteLine("Hola Mundo")
 End Sub
End Class

 

2-) A classe GermanAloMundo que implementa a interface IAloMundo
 

Public Class GermanAloMundo
                   Implements IAloMundo

 Public Sub falaAlo()
   System.Console.WriteLine("Hallo Welt")
 End Sub
End Class

 

A classse AloFactory implementa o padrão Factory e conforme o idioma retorna um objeto do tipo IAloMundo.
 

Public Class AloFactory

 Public Function CriaAloMundo(ByVal idioma As String) As IAloMundo
   Select idioma
   Case "en"
        Return New EnglishAloMundo
   Case "sp"
        Return New SpanishAloMundo
   Case "de"
        Return New GermanAloMundo
   End Select
   Return Nothing
 End Function

End Class

 

A representação UML para o exemplo acima é dado a seguir:

 

 

 

NotaEsta representação foi obtida usando o programa Violet. Você pode pegar o programa no seguinte endereço: http://horstmann.com/violet/Ele é originalmente feito para Java e para executá-lo você terá que ter instalado o JDK 1.4 ou 5.0 Runtime Environment. Ele é pequeno e grátis mas é muito simples mesmo. Para abrir o programa execute a seguinte linha de comando: java -jar violet-0.15.jar.

 

Usando o padrão factory podemos facilmente incluir novas classes concretas AloMundo na nossa classe AloFactory que pode ser criada sem que o usuário da factory tenha que saber que outra implementação foi incluída. As classes que usam as classes AloMundo somente precisam conhecer a classe Factory - AloFactory.

 

Este padrão é usado na versão 2.0 da ADO.NET nas classes dbProviderFactories dentre outras classes da plataforma .NET.

 

Para saber mais sobre dbProviderFactories leia o artigo : VB.NET 2005  - Usando factories de Provedores.

 

Até breve...

 

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti