Design Patterns

Daniel Stefani Marcon 1 Lucas Adams Seewald 1 Mauricio Berni 1 Pablo Lerina 1 Thiago Nunes Kehl 1
1

Universidade do Vale do Riodos Sinos - Unisinos

{daniel.stefani, yolaf777, mauberni, pabloalr, thiagokehl}@gmail.com

Abstract. Resumo. Os padr˜ es de projeto n˜ o devem ser visto como a salvacao universal o a ¸˜ 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 relacao u a ¸˜ de solucoes comuns que s˜ o usadas no mundo real das aplicacoes comerciais, ¸˜ a ¸˜ solucoes que j´ foram provadas e aprovadas em diferentes projetos de software. ¸˜ a Conhecer os padr˜ es de projeto pode ser muito interessante mas saber como o aplic´ -los aos seus projetos e que realmente vai fazer a diferenca. a ¸ ´

1. Singleton
O Singleton pertence ao grupo de padr˜ es creacionais, embora tenha caracter´sticas de o ı padr˜ es n˜ o creacionais tamb´ m [Cooper 1998]. o a e ´ Para saber se uma classe e um singleton, deve-se obter v´ rias vezes a instˆ ncia e a a comparar com as anteriores usando ==. Se existir pelo menos uma forma de comparar os dois objetos a e b (a == b) e o resultado for falso, a classe n˜ o e singleton. a ´ ´ E apropriado para servicos que n˜ o alteram a sua natureza baseado no contexto ¸ a de invocacao. Objetos singleton possuem a caracter´stica de independˆ ncia, ou seja, s˜ o ¸˜ ı e a stand-alone. 1.1. Prop´ sito do Padr˜ o o a Ele tem como o objetivo garantir que exista apenas uma instˆ ncia de uma certa classe em a um determinado instante no sistema e, al´ m disso, prover um ponto de acesso global a essa e instˆ ncia [Cooper 1998, Sauv´ 2009, Delfim 2008, Divine 2005]. H´ v´ rios exemplos de a e a a classes com esse prop´ sito, como, por exemplo, um spooler de impress˜ o, um sistema de o a arquivos, um gerenciador de janelas e um log de dados [Sauv´ 2009]. e ´ Para assegurar que essa classe possua uma unica instˆ ncia, a melhor solucao e a ¸˜ ´ ´ deixar a pr´ pria classe respons´ vel pela manutencao dessa instˆ ncia unica. Assim, n˜ o e o a ¸˜ a a ´ chamado o construtor para criar uma instˆ ncia de uma classe singleton, pois o seu acesso a ´ e restrito (m´ todo privado). Para a criacao de uma instˆ ncia da classe, deve-se utilizar um e ¸˜ a m´ todo p´ blico que faca o controle da instanciacao, de modo que ela s´ possa ser feita e u ¸ ¸˜ o uma vez. Dessa forma, normalmente usa-se um m´ todo est´ tico getInstance() , e a mostrado nas figuras 1 e 2, referentes aos diagramas de classes e sequˆ ncia de uma classe e singleton, e na listagem 1 [Delfim 2008].

e Listagem 2. e ´ Um exemplo de classe thread-safe e mostrado na listagem 2. private Singleton () { } . Diagrama de Classes do Singleton ˆ Figure 2. Diagrama de Sequencia do Singleton Listagem 1. “Estrutura de uma Classe Singleton Thread-safe” public class Singleton { p r i v a t e s t a t i c S i n g l e t o n i n s t a n c e = new S i n g l e t o n ( ) . ou seja. normalmente n˜ o se utiliza o ¸˜ a modificador synchronized (em Java).Figure 1. } return i n s t a n c e . “Estrutura de uma Classe Singleton” public class Singleton { private s t a t i c Singleton instance . private Singleton () { } public s t a t i c Singleton getInstance ( ) { i f ( i n s t a n c e == n u l l ) { i n s t a n c e = new S i n g l e t o n ( ) . } } Para a utilizacao de objetos singleton thread-safe. pois ele pode chegar a ser at´ 100 vezes mais lento. a sua instanciacao ¸˜ ´ e feita j´ na declaracao e o m´ todo getInstance() simplesmente retorna o objeto a ¸˜ e [Sauv´ 2009].

“Codigo Fonte da Classe SingletonFrame” package s i n g l e t o n . import j a v a x . Exemplo pr´ tico a Um exemplo concreto do uso de padr˜ o pode ser visto nas listagens 3 e 4 a [Kurniawan 2003]. s w i n g . p u b l i c c l a s s MyFrame e x t e n d s JFrame { J B u t t o n j B u t t o n 1 = new J B u t t o n ( ) . private SingletonFrame ( ) { /∗ codigo omitido ∗/ } public s t a t i c SingletonFrame getInstance ( ) { i f ( i n s t a n c e == n u l l ) i n s t a n c e = new S i n g l e t o n F r a m e ( ) . return i n s t a n c e . e 1. p u b l i c c l a s s S i n g l e t o n F r a m e e x t e n d s JFrame { private s t a t i c SingletonFrame instance . sem modificacao de c´ digo a ¸˜ o [Sauv´ 2009]. J B u t t o n j B u t t o n 2 = new J B u t t o n ( ) . } catch ( Exception e ) { } } p r i v a t e v o i d i n i t ( ) throws E x c e p t i o n { t h i s . ∗ . • Quando a instˆ ncia deve ser extens´vel atrav´ s de subclasses e os clientes poa ı e dem usar instˆ ncias diferentes polimorficamente. } } O uso desse padr˜ o e recomendado na seguintes situacoes: a ´ ¸˜ ´ • Deve haver uma unica instˆ ncia de uma classe e esta instˆ ncia deve ser acessada a a a partir de um ponto de acesso bem conhecido e definido. awt . ∗ . p u b l i c MyFrame ( ) { try { init () . s e t D e f a u l t C l o s e O p e r a t i o n ( EXIT ON CLOSE ) . ∗ . / ∗ i n i c i a l i z a e c o l o c a na t e l a 2 b o t o e s ∗ / .public s t a t i c S i n g l e t o n g e t I n s t a n c e ( ) { return i n s t a n c e . import j a v a . e v e n t . } } ´ Listagem 4. ∗ . s w i n g . “Codigo Fonte da Classe MyFrame” package s i n g l e t o n . ´ Listagem 3. awt . import j a v a .2. import j a v a x .

Proxy O padr˜ o proxy consiste em uma classe utilizada como interface para realizar algumas a operacoes em um sistema. A classe MyFrame possui dois bot˜ es. ele e utilizado e a a . j´ que ele ı ¸˜ a ¸ a ´ pode encapsular essas vari´ veis em um unica instˆ ncia. ¸˜ ´ • E mais flex´vel que m´ todos est´ ticos. percebe-se que s´ poder´ haver uma instˆ ncia da classe Sine o o a a ´ gletonFrame. Clicando-se em um deles.3. a • Traz benef´cios em relacao a vari´ veis globais para o espaco de nomes. e criada o uma instˆ ncia da classe SingletonFrame. Essa interface pode ser para qualquer tipo de objeto. ı e a 2. Diagrama de Classes do Padrao Proxy Umas das principais raz˜ es para esse padr˜ o e retardar o custo computacional o a ´ ´ de criar e inicializar um objeto at´ que seja necess´ rio us´ -lo.} void j B u t t o n 1 a c t i o n P e r f o r m e d ( ActionEvent e ) { /∗ codigo omitido ∗/ } void j B u t t o n 2 a c t i o n P e r f o r m e d ( ActionEvent e ) { /∗ codigo omitido ∗/ } p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { / ∗ c o d i g o o m i t i d o ∗ / } } Atrav´ s do c´ digo. entretanto nos pr´ ximos cliques ser´ retornada a o a uma referˆ ncia ao objeto SingletonFrame j´ criado. Ou seja. como representado no diagrama da figura 3. a ˜ Figure 3. a a • V´ rias classes singleton podem obedecer a mesma interface. como ¸˜ uma conex˜ o de rede ou um arquivo. n˜ o sendo criado mais nenhum objeto e a a desse tipo. 1. permitindo que um a singleton particular seja escolhido para trabalhar com uma determinada aplicacao ¸˜ em tempo de execucao. Consideracoes Finais ¸˜ O uso desse padr˜ o provˆ v´ rios benef´cios [Sauv´ 2009]: a e a ı e ´ • Controle de quem acessa e quando a instˆ ncia e acessada.

Um proxy para imagem pode comecar a carreg´ -la em segundo plano (background). e criado um a ¸ a e objeto MediaTracker. } } c l a s s I m a g e P r o x y e x t e n d s J P a n e l implements R u n n a b l e { /∗ codigo omitido ∗/ MediaTracker t r a c k e r . Por exemplo. img = T o o l k i t . • Se o objeto estiver e algum computador da rede e a transferˆ ncia for muito demore ada. Image img . i n t w. o a a a a ´ objeto seria carregado somente quando ele e necess´ rio para a aplicacao.jpg" . Um caso desses a ¸˜ ´ e o carregamento de uma grande imagem que o programa deve mostrar na tela. O a e proxy normalmente possui os m´ todos do objeto que ele representa. que acompanha o carregamento da imagem. • Se objeto possuir direitos de acesso limitado. . i n t h ) { /∗ codigo omitido ∗/ t r a c k e r = new M e d i a T r a c k e r ( t h i s ) . mostrada na listagem 5. 3 2 1 . imageCheck = new T h r e a d ( t h i s ) . / / m o n i t o r a o c a r r e g a m e n t o p u b l i c I m a g e P r o x y ( S t r i n g f i l e n a m e . g e t D e f a u l t T o o l k i t ( ) . e ´ Ele e utilizado quando: • Quando um objeto leva muito tempo para carregar. entretanto n˜ o s˜ o utilizados. o proxy pode validar o acesso. e mostrado o c´ digo fonte de um programa ¸˜ a ´ o ´ utilizado para carregar uma imagem. Exemplo pr´ tico a Para ilustrar a correta utilizacao desse padr˜ o. Al´ m disso. Com um proxy. t r a c k e r . /∗ codigo omitido ∗/ I m a g e P r o x y image = new I m a g e P r o x y ( "imagem. enquanto de¸ a senha na tela o que for necess´ rio al´ m da imagem u at´ mesmo retardar o carregamento a e e da imagem at´ que ele receba a requisicao [Cooper 1998]. 271) . E utilizado uma classe de proxy chamada ImageProxy. 0 ) . “Classe ImageProxy” p u b l i c c l a s s P r o x y D i s p l a y e x t e n d s JxFrame { public ProxyDisplay ( ) { s u p e r ( "Mostra imagem" ) . Os proxies podem ser usados tamb´ m para distinguir entre as requisicoes de e ¸˜ instˆ ncia de um objeto e o acesso a ele. durante a inicializacao de um proa ¸˜ grama. /∗ codigo omitido ∗/ } s t a t i c p u b l i c v o i d main ( S t r i n g [ ] a r g v ) { new P r o x y D i s p l a y ( ) . e ¸˜ 2. T h r e a d imageCheck .1. Listagem 5. v´ rios objetos s˜ o inicializados.´ quando e necess´ rio representar um objeto complexo atrav´ s de um mais simples. para retardar o carregamento da imagem e desenhar um ´ retˆ ngulo ao redor do espaco em que ser´ exibida a imagem. g e t I m a g e ( f i l e n a m e ) . addImage ( img .

o uso de factories a e fornece ao programador a oportunidade de abstrair atributos espec´ficos de um objeto ı ´ dentro de subclasses espec´ficas que ir˜ o cri´ -los. Obviamento. o 3. / / monitoramento i n i c i a l i z a 2 a t h r e a d de try { t r a c k e r . O prop´ sito do padr˜ o factory e “definir ı a a o a uma interface para criacao de objetos. um m´ todo factory n˜ o e necess´ rio ¸˜ e a ´ a para criar um objeto. uma simples chamada new far´ isso. . ˜ Figure 4. checkID ( 0 ) ) { / ∗ codigo o m i t i d o . waitForID (0 . O padr˜ o factory promove o a ` acoplamento fraco eliminando a necessidade de “amarrar” classes espec´ficas a aplicacao ı ¸˜ no c´ digo.1) . } c a t c h ( I n t e r r u p t e d E x c e p t i o n e ) {} } public void p a i n t ( Graphics g ) { i f ( t r a c k e r . Prop´ sito do padr˜ o o a ´ Tem uma unica funcao: criar objetos. } } 3.1. Por´ m. s t a r t ( ) . Factory ´ O m´ todo factory e um padr˜ o criacional. a qual no momento da criacao pode deixar as suas subclasses decidi¸˜ ¸˜ ´ rem que classe instanciar. Este padr˜ o ajuda a instanciar a subclasse apropriada criando o a objeto correto para um grupo de classes correlacionadas. O Padrao Factory .imageCheck . Este padr˜ o e chamado de factory porque e respons´ vel por a ´ a “fabricar” um objeto. . mostra a imagem ∗ / } e l s e { / ∗ d e s e n h a um c o n t o r n a na imagem ∗ / } } /∗ codigo omitido ∗/ public void run ( ) { / / m o n i t o r a c a r r e g a m e n t o da imagem /∗ codigo omitido ∗/ repaint () . Este padr˜ o ajuda a modelar a interface para e a a criacao de objetos. mas deixar as subclasses decidirem quais classes ¸˜ instanciar”.

Exemplo ´ Cen´ rio: um uso t´pico do padr˜ o factory e em COM (Component Object Model): a ı a ´ • Neste cen´ rio. o u t . p r i n t l n ( "My name is "+name ) . ProductA usa o m´ todo writeName da superclasse e e ProductB implementa o m´ todo writeName e imprime o nome ao contr´ rio. “Exemplo Pratico de Codigo do Padrao Factory” public abstract class Product { p u b l i c v o i d writeName ( S t r i n g name ) { System .O padr˜ o factory possui duas entidades. creator e a interface COM chamada de IclassFactory e o concrete a ´ creator e a classe que implementa esta interface.1. a unica classe que ı ´ precisa ser explicitamente criada pela COM e a classe factory. coordenacao entre os v´ rios objetos. e a ´ ´ ˜ Listagem 6. Desse modo. 3.2. Exemplo Pr´ tico a O exemplo mostrado na listagem 6 mostra como dois produtos concretos s˜ o criados a utilizando ProductFactory. todos os detalhes da criacao de ¸˜ ¸˜ ´ objetos podem ser abstra´dos pela classe factory. } . Tipicamente a criacao de objetos ¸˜ requer a aquisicao de recursos do sistema. como mostrado na figura 4. Este padr˜ o e usado quando uma a ´ classe ( creator) n˜ o sabe antecipadamente todas as subclasses que ir´ criar. a ¸˜ ˆ ˜ Figure 5.2. As figuras 5 e ?? mostram os diagramas de sequˆ ncia e de classes para criacao de um componente e ¸˜ utilizando o padr˜ o factory em uma aplicacao COM. Com a introducao da interface IclassFactory. um criador (creator) e um criador cona creto (concrete creator). Diagrama de Sequencia Utilizando Padrao Factory 3. Cada suba a classe (concrete creator) fica com a responsabilidade de criar realmente as instˆ ncias dos a objetos. ¸˜ ¸˜ a etc.

} } public class ProductFactory { Product createProduct ( String type ) { i f ( t y p e . p r o d = p f . p r i n t l n ( "My reversed name is" + tempName . writeName ( "John Doe" ) . o u t . c r e a t e P r o d u c t ( "A" ) . c r e a t e P r o d u c t ( "B" ) . } } public class TestClientFactory { p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { P r o d u c t F a c t o r y p f = new P r o d u c t F a c t o r y ( ) . Diagrama de Classe Utilizando Padrao Factory } public c l a s s ProductA extends Product { } public c l a s s ProductB extends Product { p u b l i c v o i d writeName ( S t r i n g name ) { S t r i n g B u i l d e r tempName = new S t r i n g B u i l d e r ( ) . } } ´ Ao executar TestClientFactory o resultado e: My name is John Doe My reversed name is eoD nhoJ Usando o padr˜ o factory podemos facilmente incluir novas classes conca retas Product na nossa classe ProductFactory que pode ser criada sem que o usu´ rio da factory tenha que saber que outra implementacao foi inclu´da. p r o d = p f . a p p e n d ( name ) . a ¸˜ ı .˜ Figure 6. e q u a l s ( "B" ) ) r e t u r n new P r o d u c t B ( ) . System . Product prod . else r e t u r n new P r o d u c t A ( ) . p r o d . writeName ( "John Doe" ) . reverse () ) . p r o d .

(1998). Acesso em Junho 2009. (2008).blogspot.br/ e ı ˜jacques/cursos/map/html/pat/singleton. html>. (2003). Acesso em Junho 2009.html >. W. ¸˜ • Abstrai pontenciais complexas l´ gicas de criacao. somente sua interface: o padr˜ o factory ¸˜ a estabelece uma forma de desenvolver objetos que s˜ o respons´ veis pela criacao de outros a a ¸˜ objetos: • Separa a responsabilidade de criacoes complexas. 3.singleton. S.edu. a Dispon´vel em <http: ı //portalarquiteto. Using the singleton pattern. R. ı onjava. Este m´ todo provˆ um “gancho” para as subclasses proverem uma vers˜ o estene e a dida do objeto.com/2008/01/o-padro-singleton. Learning design patterns . (2009).As classes que usam as classes Product somente precisam conhecer a classe Factory . Acesso em Junho 2009. .com/?q=learning-design-patterns-singleton >. J.ufcg. Kurniawan.3. Divine. J. Delfim. Dispon´vel em <http: ı //codesnipers. o ¸˜ References Cooper. ´ ´ ´ A utilizacao do padr˜ o factory e util quando e necess´ rio criar objetos dinamica¸˜ a a mente sem conhecer a classe de implementacao.ProductFactory.dsc. Sauv´ . M. The Design Patterns. P. O padr˜ o singleton. (2005). Addison-Weasley. Dispon´vel em <http://www.htm>. Singleton. Conclus˜ o a As vantagens do uso do padr˜ o factory: a ` • Elimina a necessidade de amarrar classes espec´ficas a aplicacao no c´ digo.com/pub/a/onjava/2003/08/27/singleton. Dispon´vel em <http://www. Acesso em Junho 2009. ı ¸˜ o ´ • Criar objetos dentro de uma classe com um m´ todo factory e sempre mais flex´vel e ı do que criar objetos diretamente. B.