48745995 Java XML Ajax Padroes Livro Wikipedia

Embed Size (px)

Citation preview

Java e Padres de ProjetoConhecimentos Bsicos

PDF gerado usando o pacote de ferramentas em cdigo livre mwlib. Veja http://code.pediapress.com/ para mais informao. PDF generated at: Fri, 20 Aug 2010 20:05:17 UTC

ContedoPginasIntroduoJava (linguagem de programao) Padro de projeto de software 1 1 11 15 15 20 24 30 33 38 38 39 40 41 42 43 43 46 46 47 48 48 48 52 52 53 53 54 57 58

Padres de CriaoAbstract Factory Builder Factory Method Prototype Singleton

Padres EstruturaisAdapter Bridge (padro de projeto de software) Composite Decorator Faade Flyweight Proxy (padres de projeto)

Padres ComportamentaisChain of Responsibility Command Interpreter Iterator Mediator Memento (informtica) Observer State Strategy Template Method Visitor

Ajax

AJAX (programao)

58 63 63 71 71

JavaScriptJavaScript

XMLXML

RefernciasFontes e Editores da Pgina Fontes, licenas e editores da imagem 76 77

Licenas das pginasLicena 78

1

IntroduoJava (linguagem de programao)JavaParadigma Surgido em Criado por orientao a objeto 1995 Sun Microsystems

Estilo de tipagem: esttica, forte Compiladores Influenciada por Influenciou GCJ, Javac Objective-C, C++, Smalltalk C#, Fantom, J#, Jython

Java uma linguagem de programao orientada a objeto desenvolvida na dcada de 90 por uma equipe de programadores chefiada por James Gosling, na empresa Sun Microsystems. Diferentemente das linguagens convencionais, que so compiladas para cdigo nativo, a linguagem Java compilada para um "bytecode" que executado por uma mquina virtual. A linguagem de programao Java a linguagem convencional da Plataforma Java, mas no sua nica linguagem.

HistricoEm 1991, na Sun Microsystems, foi iniciado o Green Project, o bero do Java, uma linguagem de programao orientada a objetos. Os mentores do projeto eram Patrick Naughton, Mike Sheridan, e James Gosling. O objetivo do projeto no era a criao de uma nova linguagem de programao, mas antecipar e planejar a prxima onda do mundo digital. Eles acreditavam que, em algum tempo, haveria uma convergncia dos computadores com os equipamentos e eletrodomsticos comumente usados pelas pessoas no seu dia-a-dia. Para provar a viabilidade desta idia, 13 pessoas trabalharam arduamente durante 18 meses. No vero de 1992 eles emergiram de um escritrio de Sand Hill Road no Menlo Park com uma demonstrao funcional da idia inicial. O prottipo se chamava *7 (leia-se StarSeven), um controle remoto com uma interface grfica touchscreen. Para o *7, foi criado um mascote, hoje amplamente conhecido no mundo Java, o Duke. O trabalho do Duke no *7 era ser um guia virtual ajudando e ensinando o usurio a utilizar o equipamento. O *7 tinha a habilidade de controlar diversos dispositivos e aplicaes. James Gosling especificou uma nova linguagem de programao para o *7. Gosling decidiu batiz-la de Oak, que quer dizer carvalho, uma rvore que ele podia observar quando olhava pela sua janela. O prximo passo era encontrar um mercado para o *7. A equipe achava que uma boa idia seria controlar televises e vdeo por demanda com o equipamento. Eles construram um demo chamado MovieWood, mas infelizmente era muito cedo para que o vdeo por demanda bem como as empresas de TV a cabo pudessem viabilizar o negcio. A idia que o *7 tentava vender, hoje j realidade em programas interativos e tambm na televiso digital. Permitir ao telespectador interagir com a emissora e com a programao em uma grande rede de cabos, era algo muito visionrio e estava muito longe do que as empresas de TV a cabo tinham capacidade de entender e comprar. A idia certa, na poca errada.

Java (linguagem de programao) Entretanto, o estouro da Internet aconteceu e rapidamente uma grande rede interativa estava se estabelecendo. Era este tipo de rede interativa que a equipe do *7 estava tentando vender para as empresas de TV a cabo. E, da noite para o dia, no era mais necessrio construir a infra-estrutura para a rede, ela simplesmente estava l. Gosling foi incumbido de adaptar o Oak para a Internet e em janeiro 1995 foi lanada uma nova verso do Oak que foi rebatizada para Java. A tecnologia Java tinha sido projetada para se mover por meio das redes de dispositivos heterogneos, redes como a Internet. Agora aplicaes poderiam ser executadas dentro dos browsers nos Applets Java e tudo seria disponibilizado pela Internet instantaneamente. Foi o esttico HTML dos browsers que promoveu a rpida disseminao da dinmica tecnologia Java. A velocidade dos acontecimentos seguintes foi assustadora, o nmero de usurios cresceu rapidamente, grandes fornecedores de tecnologia, como a IBM anunciaram suporte para a tecnologia Java. Desde seu lanamento, em maio de 1995, a plataforma Java foi adotada mais rapidamente do que qualquer outra linguagem de programao na histria da computao. Em 2004 Java atingiu a marca de 3 milhes de desenvolvedores em todo mundo[1] . Java continuou crescendo e hoje uma referncia no mercado de desenvolvimento de software. Java tornou-se popular pelo seu uso na Internet e hoje possui seu ambiente de execuo presente em web browsers, mainframes, SOs, celulares, palmtops, cartes inteligentes etc.

2

PadronizaoEm 1997 a Sun Microsystems tentou submeter a linguagem a padronizao pelos rgos ISO/IEC e ECMA, mas acabou desistindo. [2] [3] [4] Java ainda um standard de fato, que controlada atravs da JCP Java Community Process.[5] Em 13 de Novembro de 2006, a Sun lanou a maior parte do Java como Software Livre sob os termos da GNU General Public License (GPL). Em 8 de Maio de 2007 a Sun finalizou o processo, tornando praticamente todo o cdigo Java como software de cdigo aberto, menos uma pequena poro da qual a Sun no possui copyright.[6]

Principais Caractersticas da Linguagem JavaA linguagem Java foi projectada tendo em vista os seguintes objectivos: Orientao a objecto - Baseado no modelo de Simula67; Portabilidade - Independncia de plataforma - "escreva uma vez, execute em qualquer lugar" ("write once, run anywhere"); Recursos de Rede - Possui extensa biblioteca de rotinas que facilitam a cooperao com protocolos TCP/IP, como HTTP e FTP; Segurana - Pode executar programas via rede com restries de execuo; Alm disso, podem-se destacar outras vantagens apresentadas pela linguagem: Sintaxe similar a Linguagem C/C++. Facilidades de Internacionalizao - Suporta nativamente caracteres Unicode; Simplicidade na especificao, tanto da linguagem como do "ambiente" de execuo (JVM); distribuda com um vasto conjunto de bibliotecas (ou APIs); Possui facilidades para criao de programas distribudos e multitarefa (mltiplas linhas de execuo num mesmo programa); Desalocao de memria automtica por processo de coletor de lixo (garbage collector); Carga Dinmica de Cdigo - Programas em Java so formados por uma coleco de classes armazenadas independentemente e que podem ser carregadas no momento de utilizao.

Java (linguagem de programao)

3

Exemplos de cdigoMtodo mainO mtodo main onde o programa inicia. Pode estar presente em qualquer classe. Os parmetros de linha de comando so enviados para a array args[], do tipo String. public class OlaMundo { /** * Mtodo que executa o programa * public = visto em qualquer lugar da aplicao * static = iniciado automaticamente pela JVM, sem precisar de uma instncia * void = Mtodo sem retorno (retorno vazio) * main = Nome do mtodo, que obrigatorio ser este. Recebe como parmetro um array de String. * String[] args = Array de argumentos que podem ser repassados na chamada do programa. */ public static void main(String[] args) { System.out.println("Ol, Mundo!"); //Imprime na tela a frase } }

Criao de classesExemplo: public abstract class Animal { public abstract void fazerBarulho(); } ---public class Cachorro extends Animal { public void fazerBarulho() { System.out.println("AuAu!"); } } ---public class Gato extends Animal { public void fazerBarulho() { System.out.println("Miau!"); } }

Java (linguagem de programao) O exemplo acima cria a classe Animal e duas classes derivadas de Animal. Java no suporta herana mltipla, e todas as classes em Java derivam de Object(Classe). A nica possibilidade de se ver herana mltipla em java no uso de interfaces, pois uma so interfaces pode herdar vrias outras interfaces.

4

InterfacesUma interface modela um comportamento esperado. Pode-se entend-la como uma classe que contenha apenas mtodos abstratos. Embora uma classe no possa conter mais de uma super classe, a classe pode implementar mais de uma interface. Exemplo: public interface Pesado { double obterPeso(); } public interface Colorido { Color obterCor(); } public class Porco extends Animal implements Pesado, Colorido { public void fazerBarulho() { System.out.println("inc!"); } //Implementao da interface Pesado public double obterPeso() { return 50.00; } //Implementao da interface Colorido public Color obterCor() { return Color.BLACK; } //Uma propriedade s do porco public boolean enlameado() { return true; } }

Classes internasJava pode ter classes internas. Exemplos: public class Cavalo extends Animal { public void fazerBarulho() { System.out.println("RIINCH!"); } //Classe interna e privada. Existe s no contexto da classe "Cavalo".

Java (linguagem de programao) private class Parasita extends Animal { public void fazerBarulho() { System.out.println("SQRRT"); } } }

5

Objetos annimosPodemos ter tambm objetos annimos, aonde no necessrio instanciar o objeto em uma varivel para utiliz-lo. Exemplo: public class MostraBarulho { public static void main(String args[]) { new Cavalo().fazerBarulho(); //Objeto annimo. //Abaixo um objeto e classe annimos! new Animal() {//novo objeto public void fazerBarulho() { System.out.println("QUAC!");//imprime na tela } }.fazerBarulho(); } }

Programas simplesPrograma em Java para somar dois nmeros inteiros: import javax.swing.JOptionPane; public class Soma{ public static void main(String[]args){ //declarao das variveis String numeroA, numeroB; int numero1, numero2, soma; //pede dois nmeros inteiros numeroA = JOptionPane.showInputDialog("Entre com o primeiro nmero inteiro"); numeroB = JOptionPane.showInputDialog("Entre com o segundo nmero inteiro"); //converte os nmeros de string para inteiro numero1 = Integer.parseInt(numeroA); numero2 = Integer.parseInt(numeroB); //outra forma de converso seria utilizar o mtodo valueOf numero1 = Integer.valueOf(numeroA);

Java (linguagem de programao) numero2 = Integer.valueOf(numeroB); //efetua a soma dos nmeros soma = numero1 + numero2; //mostra o resultado da soma para o usurio JOptionPane.showMessageDialog(null,"A soma dos nmeros : " + soma,"Resultado",JOptionPane.PLAIN_MESSAGE); } }

6

ExtensesExtenses em Java: J2ME (Micro-Edition for PDAs and cellular phones) J2SE (Standard Edition) J3D (A high level API for 3D graphics programming) JAAS (Java Authentication and Authorization Service) JAIN (Java API for Integrated Networks) Java Card JMX (Java Management Extensions) JavaFX JSF (JavaServer Faces) JSP (JavaServer Pages) JavaSpaces JCE (Java Cryptography Extension) JDBC (Java Database Connectivity) JDMK (Java Dynamic Management Kit) JDO (Java Data Objects) JEE (Enterprise Edition) Jini (a network architecture for the construction of distributed systems) Jiro JMF (Java Media Framework) JMI (Java Metadata Interface) JMS (Java Message Service) JNDI (Java Naming and Directory Interface) JNI (Java Native Interface) JOGL (A low level API for 3D graphics programming, using OpenGL) JSML (Java Speech API Markup Language) JXTA (open source-based peer-to-peer infrastructure) MARF (Modular Audio Recognition Framework) OSGi (Dynamic Service Management and Remote Maintenance) SuperWaba (JavaVMs for handhelds)

Java (linguagem de programao)

7

PolimorfismoO Polimorfismo uma caracterstica muito importante em sistemas orientados a objetos. Termo proveniente do grego que significa "muitas formas". Atravs dele conseguimos realizar vrias tarefas. Existem 4 tipos de polimorfismo divididos em 2 categorias (todos eles so implementados em Java), so descritos a seguir:

Polimorfismo UniversalComo o prprio nome diz, ele universal, ou seja, ele pode ser aplicado em vrios casos, logo no consegue saber quantas vezes ser aplicado o polimorfismo. Trabalha potencialmente num conjunto infinito de tipos, de modo disciplinado. Este polimorfismo possui duas formas: Paramtrico ou parametrizao A idia do polimorfismo universal paramtrico ao definir um elemento(que pode ser uma classe, um mtodo ou alguma outra estrutura da linguagem), a definio do tipo sozinha ela incompleta, ela precisa parametrizar este tipo, ou seja, teoricamente no existiria o tipo sozinho, o que sim existe e o tipo de alguma coisa de alguma coisa, por exemplo, uma list no seria s do tipo list, e sim do tipo list de elefantes. Vale lembrar que este polimorfismo s foi implementado em Java apartir da verso 1.5. Exemplo de Polimorfismo Paramtrico em Java

//Aqui no exemplo criado um ArrayList do tipo ArrayList de Aluno, e no ArrayList, isso o polimorfismo universal paramtrico ArrayList alunos = new ArrayList();//aqui ha o como aluno Aluno a = new Aluno("Rafael"); alunos.add( a ); Aluno x = alunos.get( 0 ); System.out.println("Nome: "+ x.getNome() ); Incluso quando voc tem um ponteiro para me e ele consegue apontar para um objeto da filha, j que esse polimorfismo muito bsico, difcil voc conseguir outras coisas sem ele, por isso boa parte das linguagens orientadas a objetos conhecidas implementam esse polimorfismo. Exemplo em Cdigo: class Porca { int faces; void acopleETorca(); } class Porca8mm extends Porca { void acopleETorca(){ if (...) ... } } class Porca10mm extends Porca {

Java (linguagem de programao) void acopleETorca(){ for (...) ... } }

8

Polimorfismo Ad-Hoc implementado quando queremos definir uma coisa especfica, ou seja, este polimorfismo, diferente do universal, no pode ser usado em todo lugar, logo sabemos quantas vezes ele ser aplicado. Este polimorfismo possui duas formas: Sobrecarga (Overloading) Permite que um nome de funo seja utilizado mais de uma vez com diferentes assinaturas, ou seja, dois mtodos com o mesmo nome, porm com tipos de parmetros diferentes por quantidades ou por tipo. O compilador automaticamente chama a funo correta que deve ser utilizada. Exemplo em cdigo: Podemos citar como exemplo uma funo f aplicada aos parmetros reais a e b, onde, dependendo dos tipos dos parmetros, podemos ter a execuo da primeira ou da segunda funo, caracterizando o polimorfismo ad-hoc de overloading. class Aritmetica{ int f (int x, int y) { return x+y; } double f (double x, double y) { return x*x + y*y; } } class Testa{ public static void main(String[] args){ f(a,b); } } Coero A idia que a linguagem quem faz uma coero de tipos e no o programador, ou seja, que esta no feita voluntariamente pelo programador e sim pela linguagem. Exemplo: se o operador + definido para somar dois nmeros reais, e um nmero inteiro passado como parmetro ento o inteiro "coergido" para real. Exemplo em cdigo: class Funcionario { protected String CPF, RG, telefone, nome; } class Gerente extends Funcionario { private String departamento; } class Supervisor extends Funcionario { private String setor; }

Java (linguagem de programao) class Auxiliar extends Funcionario { } public class TesteUpcasting { public static void main(String[] args) { Gerente ger = new Gerente(); Supervisor sup = new Supervisor(); Funcionario func = ger; } //func do tipo Funcionario, mas recebe uma instncia do tipo Gerente - no caso ocorre um UPCASTING }

9

Frameworks possvel utilizar frameworks para facilitar o desenvolvimento de aplicaes. Dentre os mais utilizados pode-se destacar: Hibernate ferramenta para ORM; Junit ferramenta para auxiliar na criao de testes unitrios; Log4j ferramenta para facilitar a criao de logs na aplicao; Spring ferramenta que auxilia principalmente implementao de injeo de dependncias e inverso de controle; Struts controlador MVC (Model 2) web.

Ambientes de desenvolvimento possvel desenvolver aplicaes em Java atravs de vrios ambientes de desenvolvimento integrado (IDEs). Dentre as opes mais utilizadas pode-se destacar: BlueJ um ambiente desenvolvido por uma faculdade australiana (considerado muito bom para iniciantes); JCreator (gratuito/shareware) um ambiente desenvolvido pela Xinox (recomendado para programadores iniciantes); jEdit (recomendado para programadores iniciantes); IDEs completas (recomendado para programadores profissionais): Eclipse um projeto aberto iniciado pela IBM; IntelliJ IDEA (comercial) uma IDE desenvolvida pela JetBrains; JBuilder um ambiente desenvolvido pela empresa Borland; JDeveloper (gratuito OTN) uma IDE desenvolvida pela empresa Oracle; NetBeans (software livre) uma IDE desenvolvida pela Sun Microsystems;

Outras IDEs (menos populares): Gel (IDE) open source; Greenfoot bem parecido com o BlueJ; JGRASP bom para intermedirios, feito pela equipe do Projeto GRASP; Java Studio Creator/Enterprise (gratuito SDN) um ambiente criado pela empresa Sun Microsystems; Workshop for WebLogic (comercial/desenvolvedor) um ambiente criado pela empresa Oracle; WebSphere Studio Application Developer um ambiente criado pela empresa IBM;

Java (linguagem de programao)

10

CertificaesExistem 8 tipos de certificaes[7] da Sun Microsystems para Java: Sun Certified Enterprise Architect (SCEA) Sun Certified Mobile Application Developer (SCMAD) Sun Certified Developer For Java Web Services (SCDJWS) Sun Certified Business Component Developer (SCBCD) Sun Certified Web Component Developer (SCWCD) Sun Certified Java Developer (SCJD) Sun Certified Java Programmer (SCJP) Sun Certified Java Associate (SCJA)

Cada certificao testa algum tipo de habilidade dentro da plataforma e linguagem Java. Todos os testes so realizados pela empresa Prometric[8] e so reconhecidos internacionalmente.

ComunidadeA comunidade de desenvolvedores Java rene-se em grupo denominados JUGs (Java User Groups). No Brasil o movimento de grupos de usurios expandiu-se bastante e tem formado alguns dos maiores grupos de usurios Java do mundo[carecede fontes?], como por exemplo o PortalJava, GUJ e o JavaFree.

LicenaA Sun disponibiliza a maioria das distribuies Java gratuitamente e obtm receita com programas mais especializados como o Java Enterprise System. Em 13 de novembro de 2006, a Sun liberou partes do Java como software livre, sob a licena GNU General Public License.[9] A liberao completa do cdigo fonte sob a GPL ocorreu em maio de 2007.[10]

CuriosidadesO nmero mgico de uma classe Java, quando representado em Hexadecimal fica 0xCAFEBABE. Leia abaixo:Patrick Naughton Strangely enough the magic number for .class files was chosen long before the name Java was ever uttered in reference to this language. We were looking for something fun, unique and easy to remember. 0xcafebabe was better than the second runner-up, 0xdeadbabe. It is only a coincidence that the oblique reference to the cute barristas at Peet's Coffee was foreshadowing for the name Java.

Ver tambm Java (plataforma de software)[1] [2] [3] [4] [5] [6] [7] [8] [9] http:/ / www. sun. com/ 2004-0511/ feature/ Java Study Group (http:/ / www. open-std. org/ JTC1/ SC22/ JSG/ ) Why Java Was - Not - Standardized Twice (http:/ / csdl2. computer. org/ comp/ proceedings/ hicss/ 2001/ 0981/ 05/ 09815015. pdf) What is ECMA--and why Microsoft cares (http:/ / techupdate. zdnet. com/ techupdate/ stories/ main/ 0,14179,2832719,00. html) Java Community Process website (http:/ / www. jcp. org/ en/ home/ index) open.itworld.com - JAVAONE: Sun - The bulk of Java is open sourced (http:/ / open. itworld. com/ 4915/ 070508opsjava/ page_1. html) Java Certification (http:/ / www. sun. com/ training/ certification/ java/ index. xml) Prometric: Testing and Assessment (http:/ / www. prometric. com) Sun begins releasing Java under the GPL (http:/ / www. fsf. org/ news/ fsf-welcomes-gpl-java. html) (em ingls). Pgina visitada em 6 de julho de 2010. [10] JavaOne opening keynote notes and comments (http:/ / rollerweblogger. org/ roller/ entry/ javaone_opening_keynote_notes) (em ingls). Pgina visitada em 6 de julho de 2010.

Java (linguagem de programao)

11

Ligaes externas Pgina oficial da linguagem Java (http://java.sun.com/) Iniciando em Java (http://www.javafree.org/topic-850964-Iniciando-em-Java.html) Tutoriais oficiais da Sun (http://java.sun.com/docs/books/tutorial/) O que Java? (http://www.javafree.org/artigo/871498/Tutorial-Java-O-que-e-Java.html) Caractersticas Bsicas (http://www.javafree.org/artigo/871496/Tutorial-Java-2-Caracteristicas-Basicas.html) Orientao a Objetos com Java (http://www.javafree.org/artigo/871497/ Tutorial-Java-3-Orientacao-a-Objetos.html)

Padro de projeto de softwareOs padres de projeto de software ou padres de desenho de software, tambm muito conhecido pelo termo original em ingls: Design Patterns, descrevem solues para problemas recorrentes no desenvolvimento de sistemas de software orientados a objetos. Um padro de projeto estabelece um nome e define o problema, a soluo, quando aplicar esta soluo e suas conseqncias. Os padres de projeto visam facilitar a reutilizao de solues de desenho - isto , solues na fase de projeto do software, sem considerar reutilizao de cdigo. Tambm acarretam um vocabulrio comum de desenho, facilitando comunicao, documentao e aprendizado dos sistemas de software.

HistriaO conceito de padro de projeto foi criado na dcada de 70 pelo arquiteto Christopher Alexander.[1] [2] Em seus livros Notes on the Synthesis of Form, The Timeless Way of Building e A Pattern Language, ele estabelece que um padro deve ter, idealmente, as seguintes caractersticas: Encapsulamento: um padro encapsula um problema/soluo bem definida. Ele deve ser independente, especfico e formulado de maneira a ficar claro onde ele se aplica. Generalidade: todo padro deve permitir a construo de outras realizaes a partir deste padro. Equilbrio: quando um padro utilizado em uma aplicao, o equilbrio d a razo, relacionada com cada uma das restries envolvidas, para cada passo do projeto. Uma anlise racional que envolva uma abstrao de dados empricos, uma observao da aplicao de padres em artefatos tradicionais, uma srie convincente de exemplos e uma anlise de solues ruins ou fracassadas pode ser a forma de encontrar este equilbrio. Abstrao: os padres representam abstraes da experincia emprica ou do conhecimento cotidiano. Abertura: um padro deve permitir a sua extenso para nveis mais baixos de detalhe. Combinatoriedade: os padres so relacionados hierarquicamente. Padres de alto nvel podem ser compostos ou relacionados com padres que endeream problemas de nvel mais baixo. Alm da definio das caractersticas de um padro, Alexander definiu o formato que a descrio de um padro deve ter. Ele estabeleceu que um padro deve ser descrito em cinco partes: Nome: uma descrio da soluo, mais do que do problema ou do contexto. Exemplo: uma ou mais figuras, diagramas ou descries que ilustrem um prottipo de aplicao. Contexto: a descrio das situaes sob as quais o padro se aplica. Problema: uma descrio das foras e restries envolvidos e como elas interagem.

Soluo: relacionamentos estticos e regras dinmicas descrevendo como construir artefatos de acordo com o padro, freqentemente citando variaes e formas de ajustar a soluo segundo as circunstncias. Inclui referncias a outras solues e o relacionamento com outros padres de nvel mais baixo ou mais alto.

Padro de projeto de software Em 1987, a partir dos conceitos criados por Alexander, os programadores Kent Beck e Ward Cunningham propuseram os primeiros padres de projeto para a rea da cincia da computao. Em um trabalho para a conferncia OOPSLA, eles apresentaram alguns padres para a construo de janelas na linguagem Smalltalk.[3] Nos anos seguintes Beck, Cunningham e outros seguiram com o desenvolvimento destas idias. O movimento ao redor de padres de projeto ganhou popularidade com o livro Design Patterns: Elements of Reusable Object-Oriented Software, publicado em 1995. Os autores desse livro so Erich Gamma, Richard Helm, Ralph Johnson e John Vlissides, conhecidos como a "Gangue dos Quatro" (Gang of Four) ou simplesmente "GoF". Posteriormente, vrios outros livros do estilo foram publicados, como Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development, que introduziu um conjunto de padres conhecidos como GRASP (General Responsibility Assignment Software Patterns).

12

Padres GoFOs padres "GoF" so organizados em famlias de padres: de criao, estruturais e comportamentais. Os padres de criao so relacionados criao de objetos, os estruturais tratam das associaes entre classes e objetos e os comportamentais das interaes e divises de responsabilidades entre as classes ou objetos. Um padro "GoF" tambm classificado segundo o seu escopo: de classe ou de objeto. Nos padres com escopo de classe os relacionamentos que definem este padro so definidos atravs de herana e em tempo de compilao. Nos padres com escopo de objeto o padro encontrado no relacionamento entre os objetos definidos em tempo de execuo. Padres "GoF" organizados nas suas famlias: Padres de criao Abstract Factory Builder Factory Method Prototype Singleton

Padres estruturais Adapter Bridge Composite Decorator Faade Flyweight Proxy

Padro de projeto de software Padres comportamentais Chain of Responsibility Command Interpreter Iterator Mediator Memento Observer State Strategy Template Method Visitor

13

Padres GRASP Controller Creator Expert Law of Demeter Low Coupling/High Cohesion Polymorphism Pure Fabrication

[1] Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. 1.ed.Estados Unidos da Amrica:Addison-Wesley, 1995. ISBN 0-201-63361-2 [2] Doug Lea. Christopher Alexander:An Introduction for Object-Oriented Designers (http:/ / g. oswego. edu/ dl/ ca/ ca/ ca. html) (em Ingls). Pgina visitada em 18 de abril de 2007. [3] Kent Beck, Ward Cunningham. Using Pattern Languages for Object-Oriented Programs (http:/ / c2. com/ doc/ oopsla87. html) (em Ingls). Pgina visitada em 18 de abril de 2007.

Bibliografia Christopher Alexander. Notes on the Synthesis of Form. Estados Unidos da Amrica:Harvard University Press, 1964. ISBN 0-674-62751-2 Christopher Alexander. The Timeless Way of Building. Estados Unidos da Amrica:Oxford University Press, 1979. ISBN 0-19-502402-8 Christopher Alexander. A Pattern Language. Estados Unidos da Amrica:Oxford University Press, 1977. ISBN 0-19-501919-9 Craig Larman. Applying UML and Patterns: An Introduction to Object-Oriented Analysis and Design and Iterative Development. 1.ed.Estados Unidos da Amrica:Prentice Hall, 2004.pp.736. ISBN 0-13-148906-2 Gregor Hohpe, Bobby Woolf. Enterprise Integration Patterns: Designing, Building, And Deploying Messaging Solutions. 1.ed.Estados Unidos da Amrica:Addinson-Wesley, 2004.pp.659. ISBN 0-321-20068-3 Pablo Dall'Oglio. PHP Programando com Orientao a Objetos (http://www.adianti.com.br/phpoo): Inclui Design Patterns. 1.ed.So Paulo:Novatec, 2007.pp.576. ISBN 978-85-7522-137-2 Alexandre Altair de Melo e Mauricio G. F. Nascimento. PHP Profissional (http://www.novatec.com.br/livros/ phppro): Aprenda a desenvolver sistemas profissionais orientados a objetos com padres de projeto. 1.ed.So Paulo:Novatec, 2007.pp.464. ISBN 978-85-7522-141-9

Padro de projeto de software

14

Ligaes externas Lista de alguns padroes comuns (http://www.mindspring.com/~mgrand/pattern_synopses2.htm) (em ingls) Pgina com descries e exemplos dos padres GoF (http://www.vincehuston.org/dp/) (em ingls)

15

Padres de CriaoAbstract FactoryAbstract Factory um padro de projeto de software (tambm conhecido como design pattern em ingls). Este padro permite a criao de famlias de objetos relacionados ou dependentes, atravs de uma nica interface e sem que a classe concreta seja especificada.

UtilizaoO padro Abstract Factory pode ser utilizado na implementao de um toolkit que disponibilize controles que funcionam em diferentes interfaces grficas, tal como Motif, GTK+ (GNOME) ou Qt (KDE). Estas GUIs possuem diferentes padres de controles visuais e, para facilitar a construo de aplicativos que interajam facilmente com diferentes interfaces grficas, interessante que se defina interfaces comuns para acesso aos controles, independentemente da GUI utilizada. Este problema pode ser resolvido atravs de uma classe abstrata que declara uma interface genrica para criao dos controles visuais e de uma classe abstrata para criao de cada tipo de controle. O comportamento especfico, de cada um dos padres tecnolgicos contemplados, implementado atravs de uma classe concreta. O aplicativo, ou "cliente", interage com o toolkit atravs das classes abstratas sem ter conhecimento da implementao das classes concretas. Um exemplo bem simplista seria um projeto com interface para Mobile e para Desktop, uma boa opo para reaproveitar os mesmos controles de interface seria criar pacotes com classes abstratas e os pacotes com as classes concretas implementando apenas as diferenas. Esse padro tambm se aplica na padronizao de ambientes, por exemplo, tamanhos de botes, fontes, cores de fundo, largura de bordas. Com isso e havendo uma poltica que exija que os desenvolvedores usem essas classes em vez das nativas da linguagem, ajudar a padronizar a aparncia e comportamento das aplicaes.

ExemploNeste exemplo, a classe abstrata WidgetFactory possui duas especializaes: MotifWidgetFactory para widgets Motif e QtWidgetFactory para widgets Qt. Essas especializaes so classes concretas capazes de "produzir" os elementos da interface grfica. O cliente do toolkit obtm os elementos grficos de que necessita atravs da classe (interface) WidgetFactory sem ter conhecimento das classes concretas. Da mesma maneira, o cliente somente interage com as interfaces que representam os elementos produzidos pela Abstract Factory (no exemplo, a classe Janela e a classe Botao).

Abstract Factory Estrutura

16

Exemplo de Diagrama em UML para o Padro Abstract Factory.

Cdigo em Java Este cdigo, escrito na linguagem Java, mostra a implementao do diagrama mostrado acima. Por uma questo de simplicidade, o cdigo relacionado s janelas omitido.

abstract class WidgetFactory { public static WidgetFactory obterFactory() { if( Configuracao.obterInterfaceGraficaAtual() == Configuracao.MotifWidget ) { return new MotifWidgetFactory(); } else { return new QtWidgetFactory(); } } public abstract Botao criarBotao(); } class MotifWidgetFactory extends WidgetFactory { public Botao criarBotao() {

Abstract Factory return new BotaoMotif(); } } class QtWidgetFactory extends WidgetFactory { public Botao criarBotao() { return new BotaoQt(); } } abstract class Botao { public abstract void desenhar(); } class BotaoMotif extends Botao { public void desenhar() { System.out.println("Eu sou um botao Motif!"); } } class BotaoQt extends Botao { public void desenhar() { System.out.println("Eu sou um botao Qt!"); } } public class Cliente { public static void main(String[] args) { WidgetFactory factory = WidgetFactory.obterFactory(); Botao botao = factory.criarBotao(); botao.desenhar(); } } Este exemplo imprimiria na tela o texto "Eu sou um botao Motif!" ou "Eu sou um botao Qt!" dependendo do valor retornado pelo mtodo Configuracao.obterInterfaceGraficaAtual(), que descobre a interface grfica, Motif ou Qt, utilizada pelo sistema.

17

Abstract Factory Cdigo em VB.NET Public MustInherit Class WidgetFactory Shared Function obterFactory() As WidgetFactory If Configuracao.obterInterfaceGraficaAtual() Is Configuracao.MotifWidget Then Return New MotifWidgetFactory() Else Return New QtWidgetFactory() End If End Function Public MustOverride Function criarBotao() As Botao End Class Public Class MotifWidgetFactory Inherits WidgetFactory Public Overrides Function criarBotao() As Botao Return New BotaoMotif End Function End Class Public Class QtWidgetFactory Inherits WidgetFactory Public Overrides Function criarBotao() As Botao Return New BotaoQt End Function End Class Public MustInherit Class Botao Public MustOverride Sub desenhar() End Class Public Class BotaoMotif Inherits Botao Public Overrides Sub desenhar() Console.Out.WriteLine("Eu sou um boto Motif.") End Sub End Class

18

Abstract Factory

19

Public Class BotaoQt Inherits Botao Public Overrides Sub desenhar() Console.Out.WriteLine("Eu sou um boto Qt.") End Sub End Class Public Class Client Public Shared Sub main() Dim factory As WidgetFactory = WidgetFactory.obterFactory Dim botao As Botao = factory.criarBotao botao.desenhar() End Sub End Class

Padres relacionados Factory Method Prototype Singleton

Bibliografia Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. 1.ed.Estados Unidos da Amrica:Addison-Wesley, 1995. ISBN 0-201-63361-2 Steven John Metsker. Padres de Projeto Em Java. 1.ed.Brasil:Bookman, 2004. ISBN 85-363-0411-1

Builder

20

BuilderBuilder um padro de projeto de software que permite a separao da construo de um objeto complexo da sua representao, de forma que o mesmo processo de construo possa criar diferentes representaes.

EstruturaO padro Builder, da forma como foi descrito no livro Design Patterns: Elements of Reusable Object-Oriented Software, contm os seguintes elementos: director constri um objeto utilizando a interface do builder; builder especifica uma interface para um construtor de partes do objeto-produto;Diagrama UML da estrutura do padro Builder

concrete builder define uma implementao da interface builder, mantm a representao que cria e fornece interface para recuperao do produto; product o objeto complexo em construo. Inclui classes que definem as parte constituintes.

UtilizaoO padro Builder pode ser utilizado em uma aplicao que converte o formato RTF para uma srie de outros formatos e que permite a incluso de suporte para converso para outros formatos, sem a alterao do cdigo fonte do leitor de RTF. A implementao da soluo para esse problema pode ser realizada atravs de uma classe de leitura (director) associada a uma classe capaz de converter o formato RTF para outra representao (builder). O objeto da classe de leitura l cada token do texto e executa o mtodo apropriado no objeto de converso, de acordo com tipo do token. A classe de converso possui um mtodo para cada tipo de token, incluindo os caracteres comuns, pargrafos, fontes e etc. Para cada formato de texto suportado criada uma classe de converso especializada (concrete builder). Um conversor para formato ASCII, por exemplo, poderia ignorar qualquer requisio para converter tokens que no fossem caracteres comuns. Um conversor para o formato PDF, por outro lado, iria processar qualquer requisio para poder converter o estilo, alm do texto.

Comparao com o Abstract FactoryO padro Builder muitas vezes comparado com o padro Abstract Factory pois ambos podem ser utilizados para a construo de objetos complexos. A principal diferena entre eles que o Builder constri objetos complexos passo a passo e o Abstract Factory constri famlias de objetos, simples ou complexos, de uma s vez.

ExemploNeste exemplo, o mtodo lerRTF() (classe LeitorRTF) percorre uma lista com os tokens encontrados no texto de entrada (formato RTF) e, para cada tipo de token, chama um mtodo do objeto de tipo ConversorTexto. Dependendo do formato escolhido para o texto de destino, ser escolhida uma implementao da classe ConversorTexto: ConversorPDF, ConversorTeX ou ConversorASCII. Cada uma destas classes implementa os mtodos de acordo com as caractersticas do formato relacionado. A classe ConversorASCII no implementa os mtodos converteParagrafo()

Builder e converteFonte() pois este formato (ASCII) no possui elementos de estilo. Diagrama

21

Exemplo de Diagrama em UML para o Padro Builder.

Cdigo Este cdigo, escrito na linguagem Java, mostra a implementao do diagrama mostrado acima. abstract class ConversorTexto { public void converterCaractere(char c) { // vazio } public void converterParagrafo() { // vazio } public void converterFonte(Fonte f) { // vazio } } class ConversorPDF extends ConversorTexto { public void converterCaractere(char c) { System.out.print("Caractere PDF"); } public void converterParagrafo() { System.out.print("Pargrafo PDF"); }

Builder

22

public void converterFonte(Fonte f) { System.out.print("Fonte PDF"); } } class ConversorTeX extends ConversorTexto { public void converterCaractere(char c) { System.out.print("Caractere Tex"); } public void converterParagrafo() { System.out.print("Paragrafo Tex"); } public void converterFonte(Fonte f) { System.out.print("Fonte Tex"); } } class ConversorASCII extends ConversorTexto { public void converterCaractere(char c) { System.out.print("Caractere ASCII"); } } class LeitorRTF { private ConversorTexto conversor; LeitorRTF(ConversorTexto c) { this.conversor = c; } public void lerRTF() { List tokens = obterTokensDoTexto(); for (Token t : tokens) { if (t.getTipo() == Token.Tipo.CARACTERE) { conversor.converterCaractere(t.getCaractere()); } if (t.getTipo() == Token.Tipo.PARAGRAFO) { conversor.converterParagrafo(); } if (t.getTipo() == Token.Tipo.FONTE) { conversor.converterFonte(t.getFonte());

Builder } } } } public class Cliente { public static void main(String[] args) { ConversorTexto conversor; if (args[0].equals("pdf")) { conversor = new ConversorPDF(); } else if (args[0].equals("tex")) { conversor = new ConversorTeX(); } else { conversor = new ConversorASCII(); } LeitorRTF leitor = new LeitorRTF(conversor); leitor.lerRTF(); } } A classe Cliente determina, atravs do parmetro passado ao programa Java ("pdf" para formato PDF, "tex" para Tex e qualquer outro para ASCII), qual das classes derivadas de ConversorTexto ir utilizar na construo da classe LeitorRTF.

23

Padres relacionados Abstract Factory Composite

Bibliografia Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. 1.ed.Estados Unidos da Amrica:Addison-Wesley, 1995. ISBN 0-201-63361-2

Factory Method

24

Factory MethodFactory Method, na cincia da computao, um padro de projeto de software (design pattern, em ingls) que fornece uma interface para criao de famlias de objetos relacionados ou dependentes, sem especificar suas classes concretas. O factory method permite adiar a instanciao para as subclasses.

EstruturaO padro Factory Method, da forma como foi descrito no livro Design Patterns: Elements of Reusable Object-Oriented Software, contm os seguintes elementos: Creator declara o factory method (mtodo de fabricao) que retorna o objeto da classe Product (produto). Este elemento tambm pode definir uma implementao Diagrama UML da estrutura do padro Factory Method bsica que retorna um objeto de uma classe ConcreteProduct (produto concreto) bsica; ConcreteCreator sobrescreve o factory method e retorna um objeto da classe ConcreteProduct; Product define uma interface para os objectos criados pelo factory method; ConcreteProduct uma implementao para a interface Product.

UtilizaoEste padro muito utilizado em frameworks para definir e manter relacionamentos entre objetos. O framework Spring, dependendo da configurao, pode utilizar um Factory Method para criar os seus beans.[1] Este padro pode ser utilizado na construo de um framework que suporta aplicaes que apresentam mltiplos documentos ao usurio. Normalmente este tipo de aplicao manipula um nmero varivel de formatos de documento e, por isso, este framework deve ser flexvel o bastante para suportar qualquer formato. Uma soluo para este problema poderia disponibilizar, no framework, o cdigo para alguns dos formatos mais utilizados. Mas, na prtica, esta soluo seria uma implementao pouco flexvel, e at mesmo incompleta, j que custoso implementar os mais variados formatos. O padro Factory Method prope uma soluo que deixa para o cliente (a implementao da aplicao) a tarefa de suportar os formatos necessrios e para o framework o papel de definio de uma abstrao que oferece uma interface nica para criao de documentos. Este framework seria baseado em duas classes abstratas, que representam a Aplicao e o Documento. O cliente do framework fornece um par de classes concretas, uma aplicao e o respectivo documento, para cada um dos formatos de Documento suportados pela Aplicao. Se for necessrio apresentar um documento que suporte desenho, por exemplo, o cliente deve disponibilizar as classes AplicacaoDesenho e DocumentoDesenho (supondo que o sufixo "Desenho" indique classes que suportam esta funcionalidade). O objetivo do Factory Method est em diversas classes que implementam a mesma operao, retornarem o mesmo tipo abstrato, mas internamente instanciam diferentes classes que o implementam. Com o Factory Method o criador do objeto faz uma escolha de qual classe instanciar para o cliente. Para ser um Factory Method o mtodo precisa retornar (ou uma interface ou uma classe abstrata), e dependendo das necessidades do cliente criar um objeto determinado como retorno. Um exemplo clssico do Factory Method so os iteradores tanto em Java como em .NET

Factory Method

25

ExemploNeste exemplo, uma aplicao, que construda atravs de um framework baseado no padro Factory Method, suporta a criao de documentos do tipo MeuDocumento. O framework constitudo pelas classes abstratas Aplicacao e Documento. A aplicao disponibiliza as classes concretas MinhaAplicacao e MeuDocumento. A classe MinhaAplicacao uma implementao da abstrao definida pela classe Aplicacao. Diagrama

Exemplo de Diagrama em UML para o Padro Factory Method.

A chave deste padro est na declarao do mtodo abstrato criaDocumento, da classe Aplicacao, e na sua utilizao pelo mtodo novoDocumento. Este arranjo permite que o mtodo novoDocumento crie documentos sem conhecer os detalhes de implementao, existentes em cada tipo de documento suportado pela aplicao. Isto permite que a implementao do mtodo criaDocumento (neste exemplo situada na classe MinhaAplicacao) varie livremente, para atender os diversos formatos possivelmente suportados, sem que seja necessrio modificar o cdigo das classes abstratas. Cdigo em Java Este cdigo, escrito na linguagem Java, mostra a implementao do diagrama mostrado acima.

/** * Abstrao de uma Aplicao capaz de manipular * documentos. */ abstract class Aplicacao { private Documento doc; /**

Factory Method * Abstrao do Factory Method */ abstract Documento criaDocumento(); void novoDocumento() { this.doc = this.criaDocumento(); } void abrirDocumento() { this.doc.abrir(); } } /** * Abstrao de um Documento. */ abstract class Documento { void abrir() { System.out.println("Documento:Abrir documento!"); } void fechar() { System.out.println("Documento:Fechar documento!"); } void gravar() { System.out.println("Documento:Gravar documento!"); } } /** * Esta classe concreta contm a implementao * de uma aplicao capaz de manipular documentos * do tipo MeuDocumento. */ class MinhaAplicacao extends Aplicacao { /** * Uma implementao do Factory Method. Este mtodo * especializado na criao de documentos do tipo MeuDocumento */ Documento criaDocumento() { return new MeuDocumento(); } }

26

Factory Method /** * Esta classe concreta contm a implementao * de um tipo de documento especfico. */ class MeuDocumento extends Documento { } Cdigo em VB.NET O mesmo exemplo acima, em linguagem Visual Basic .NET. Public MustInherit Class Aplicacao Private doc As Documento MustOverride Function criaDocumento() As Documento Sub novoDocumento() Me.doc = Me.criaDocumento End Sub Sub abrirDocumento() Me.doc.abrir() End Sub End Class Public MustInherit Class Documento Sub abrir() Console.WriteLine("Documento:Abrir documento!") End Sub Sub fechar() Console.WriteLine("Documento:Fechar documento!") End Sub Sub gravar() Console.WriteLine("Documento:Gravar documento!") End Sub End Class Public Class MinhaAplicacao Inherits Aplicacao Public Overrides Function criaDocumento() As Documento

27

Factory Method Return New MeuDocumento End Function End Class Public Class MeuDocumento Inherits Documento End Class Cdigo em C# O mesmo exemplo acima, em linguagem C# public abstract class Aplicacao { private Documento doc; Documento criaDocumento(); void novoDocumento() { this.doc = this.criaDocumento(); }

28

void abrirDocumento() { this.doc.abrir(); } } public abstract class Documento { void abrir() { Console.WriteLine("Documento:Abrir documento!"); } void fechar() { Console.WriteLine("Documento:Fechar documento!"); } void gravar() { Console.WriteLine("Documento:Gravar documento!"); }

Factory Method } public class MinhaAplicacao : Aplicacao { public Documento criaDocumento() { return new MeuDocumento(); } } public class MeuDocumento : Documento { }

29

Padres relacionados Abstract Factory Template Method Prototype[1] Rod Johnson, Juergen Hoeller, Alef Arendsen, Colin Sampaleanu, Rob Harrop, Thomas Risberg, Darren Davison, Dmitriy Kopylenko, Mark Pollack, Thierry Templier, Erwin Vervaet, Portia Tung, Ben Hale, Adrian Colyer, John Lewis, Costin Leau, Rick Evans. The Spring Framework - Reference Documentation (http:/ / www. springframework. org/ docs/ reference/ beans. html#beans-factory-class-instance-factory-method) (em Ingls). Pgina visitada em 16 de maio de 2007.

Bibliografia Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. 1.ed.Estados Unidos da Amrica:Addison-Wesley, 1995. ISBN 0-201-63361-2 Steven John Metsker. Padres de Projeto Em Java. 1.ed.Brasil:Bookman, 2004. ISBN 85-363-0411-1

Prototype

30

PrototypePrototype, na cincia da computao, um padro de projeto de software (design pattern, em ingls) que permite a criao de objetos a partir de um modelo original, ou prottipo.

EstruturaO padro Prototype, da forma como foi descrito no livro Design Patterns: Elements of Reusable Object-Oriented Software, contm os seguintes elementos: prototype uma classe que declara uma interface para objetos capazes de clonar a si mesmo; prototype concreto implementao de um prototype; cliente cria um novo objeto atravs de um prototype que capaz de clonar a si mesmo.Diagrama UML da estrutura do padro Prototype

Efetivamente, cada objeto , ele prprio, uma factory especializado em construir objetos iguais a si mesmo. O padro Prototype utilizado freqentemente em linguagens estaticamente tipadas como C++ e Java, e menos freqentemente utilizadas em linguagens dinamicamente tipadas como Smalltalk. O padro Prototype exige a implementao de uma operao de clonagem em cada uma das classes concretas do prottipo. Esta tarefa pode ser inconveniente, no caso do reaproveitamento de classes pr-existentes que no possuem tal operao, ou mesmo complexa, se for considerada a possibilidade de existirem referncias circulares nos atributos de um objeto (um objeto possui um atributo que referncia um objeto que, por sua vez, referncia o objeto original).

UtilizaoO padro Prototype pode ser utilizado em sistemas que precisam ser independentes da forma como os seus componentes so criados, compostos e representados. O padro Prototype pode ser til em sistemas com as seguintes caractersticas: sistemas que utilizam classes definidas em tempo de execuo; sistemas que utilizam o padro Abstract Factory para criao de objetos. Neste caso, a hierarquia de classes pode se tornar muito complexa e o padro Prototype pode ser uma alternativa mais simples, por realizar a mesma tarefa com um nmero reduzido de classes; sistemas que possuem componentes cujo estado inicial possui poucas variaes e onde conveniente disponibilizar um conjunto pr-estabelecido de prottipos que do origem aos objetos que compem o sistema. Quando utiliza o framework Spring, por exemplo, um desenvolvedor pode configurar um JavaBean como "prototype". Esta configurao faz com que cada uma das referncias a um JavaBean aponte para uma instncia diferente. O comportamento padro, ou singleton, define que todas as referncias a um JavaBean apontem para a mesma instncia de uma classe.[1]

Prototype

31

ExemploNeste exemplo mostrado uma hierarquia de classes representando documentos de formato ASCII e PDF que so criados atravs da classe Cliente. A partir de duas instncias prototpicas, ascii e pdf, o mtodo criarDocumento cria clones de documentos de acordo com o tipo desejado. A tarefa de realizar a criao da instncia implementada na classe Documento e herdada por suas classes filhas, ASCII e PDF. Diagrama

Exemplo de Diagrama em UML para o Padro Prototype.

Cdigo Este cdigo, escrito na linguagem Java, mostra a implementao do diagrama mostrado acima.

abstract class Documento implements Cloneable { protected Documento clone() { Object clone = null; try { clone = super.clone(); } catch (CloneNotSupportedException ex) { ex.printStackTrace(); } return (Documento) clone; } } class ASCII extends Documento { } class PDF extends Documento { }

Prototype

32

class Cliente { static final int DOCUMENTO_TIPO_ASCII = 0; static final int DOCUMENTO_TIPO_PDF = 1; private Documento ascii = new ASCII(); private Documento pdf = new PDF(); public Documento criarDocumento(int tipo) { if (tipo==Cliente.DOCUMENTO_TIPO_ASCII) { return ascii.clone(); } else { return pdf.clone(); } } } Observao: Na linguagem Java, a interface Cloneable no possui mtodos e utilizada apenas para indicar que o mtodo Object.clone() pode realizar uma cpia, atributo por atributo, das instncias de uma classe. [2] Neste exemplo, a implementao da cpia da instncia delegada ao mtodo clone da super classe Object (A classe raiz da hierarquia de classes da linguagem Java). Se fosse necessrio, as classes Documento, ASCII ou PDF implementariam esse mtodo para refletir algum comportamento especfico.

Padres relacionados Abstract Factory Composite Decorator[1] Rod Johnson, Juergen Hoeller, Alef Arendsen, Colin Sampaleanu, Rob Harrop, Thomas Risberg, Darren Davison, Dmitriy Kopylenko, Mark Pollack, Thierry Templier, Erwin Vervaet, Portia Tung, Ben Hale, Adrian Colyer, John Lewis, Costin Leau, Rick Evans. The Spring Framework - Reference Documentation (http:/ / www. springframework. org/ docs/ reference/ beans. html#beans-factory-scopes-prototype) (em Ingls). Pgina visitada em 13 de junho de 2007. [2] Sun Microsystems. JavaTM 2 Platform Std. Ed. (http:/ / java. sun. com/ j2se/ 1. 4. 2/ docs/ api/ java/ lang/ Cloneable. html) (em ingls). Pgina visitada em 13 de junho de 2007.

Bibliografia Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. 1.ed.Estados Unidos da Amrica:Addison-Wesley, 1995. ISBN 0-201-63361-2

Singleton

33

SingletonSingleton, um padro de projeto de software (do ingls Design Pattern). Este padro garante a existncia de apenas uma instncia de uma classe, mantendo um ponto global de acesso ao seu objeto. Nota lingustica: O termo vem do significado em ingls quando se resta apenas uma carta nas mos, num jogo de baralho.

Diagrama UML de uma classe singleton.

Muitos projetos necessitam que algumas classes tenham apenas uma instncia. Por exemplo, em uma aplicao que precisa de uma infraestrutura de log de dados, pode-se implementar uma classe no padro singleton. Desta forma existe apenas um objeto responsvel pelo log em toda a aplicao que acessvel unicamente atravs da classe singleton.

ExemplosEm JavaSegue um exemplo em Java de classe Singleton usada em log de dados. Esta classe suporta inicializao sob demanda e ambientes multi-thread. public class SingletonLog { // Construtor privado. Suprime o construtor pblico padrao. private SingletonLog() { // Leitura da configurao de log. Normalmente descrita em um arquivo. } // Faz o log de eventos da aplicacao public void doLog(String eventDescription) { } //Retorna a instncia nica da classe SingletonLog public static SingletonLog getInstance() { return SingletonLogHolder.instance; } //Classe auxiliar para criacao da instancia. Evita problemas de sincronizacao de threads. private static class SingletonLogHolder { private static SingletonLog instance = new SingletonLog(); } }

Singleton

34

Em C++Segue um exemplo em C++ da implementao de uma classe Singleton: class MyClass { private: MyClass() {} //contructor padro, no deve ser utilizado isoladamente public: static MyClass& getInstance() { static MyClass *instance = 0; if (!instance) instance = new MyClass(); return *instance; } };

Em DelphiAbaixo segue um exemplo de como implementar uma classe Singleton: Por exemplo, numa classe Fachada, onde se encontra todos os mtodos disponveis para a interface da aplicao, pode ser criado um mtodo dinmico para que todos os que visualizam essa classe, no criarem mais instncias da mesma. class function TFachada.ObterInstancia: TFachada; begin If FInstance = nil Then FInstance := Cliente.Fachada.TFachada.Create();//objeto instanciado atravs do Finstance Result := FInstance;//retorna o objeto end;

Em PHP