Exemplos de padrões de design do GoF nas principais bibliotecas do Java

672

Estou aprendendo os padrões de design Java do GoF e quero ver alguns exemplos da vida real deles. Quais são alguns bons exemplos desses padrões de design nas principais bibliotecas do Java?

unj2
fonte

Respostas:

3229

Você pode encontrar uma visão geral de muitos padrões de design na Wikipedia . Também menciona quais padrões são mencionados pelo GoF. Vou resumir aqui e tentar atribuir o maior número possível de implementações de padrões, encontradas nas APIs Java SE e Java EE.


Padrões criacionais

Fábrica abstrata (reconhecível pelos métodos criacionais que retornam a própria fábrica que, por sua vez, podem ser usados ​​para criar outro tipo abstrato / interface)

Construtor (reconhecível pelos métodos criacionais que retornam a própria instância)

Método de fábrica (reconhecível pelos métodos criacionais que retornam uma implementação de um tipo abstrato / interface)

Protótipo (reconhecível pelos métodos criacionais que retornam uma instância diferente de si mesma com as mesmas propriedades)

Singleton (reconhecível pelos métodos criacionais que retornam a mesma instância (geralmente por si só) toda vez)


Padrões estruturais

Adaptador (reconhecível pelos métodos criacionais que tomam uma instância de tipo abstrato / interface diferente e retornam uma implementação do próprio / outro tipo abstrato / interface que decora / substitui a instância especificada)

Bridge (reconhecível por métodos criacionais, pegando uma instância de tipo abstrato / interface diferente e retornando uma implementação do próprio tipo abstrato / interface que delega / usa a instância especificada)

  • Nada vem à mente ainda. Um exemplo fictício seria o new LinkedHashMap(LinkedHashSet<K>, List<V>)que retorna um mapa vinculado não modificável que não clona os itens, mas os utiliza . Os métodos java.util.Collections#newSetFromMap()e singletonXXX()no entanto se aproximam.

Composto (reconhecível por métodos comportamentais que levam uma instância do mesmo tipo abstrato / interface para uma estrutura em árvore)

Decorador (reconhecível pelos métodos criacionais que tomam uma instância do mesmo tipo de resumo / interface que adiciona comportamento adicional)

Fachada (reconhecível por métodos comportamentais que internamente usam instâncias de diferentes tipos abstratos / de interface independentes)

Flyweight (reconhecível pelos métodos criacionais que retornam uma instância em cache, um pouco a ideia "multiton")

Proxy (reconhecível pelos métodos criacionais que retornam uma implementação de determinado tipo de resumo / interface que, por sua vez, delega / usa uma implementação diferente de determinado tipo de resumo / interface)


Padrões comportamentais

Cadeia de responsabilidade (reconhecível por métodos comportamentais que (indiretamente) chama o mesmo método em outra implementação do mesmo tipo de resumo / interface em uma fila)

Comando (reconhecível por métodos comportamentais em um tipo de resumo / interface que chama um método em uma implementação de um tipo de resumo / interface diferente que foi encapsulado pela implementação de comando durante sua criação)

Intérprete (reconhecível pelos métodos comportamentais que retornam uma instância / tipo estruturalmente diferente da instância / tipo fornecido; observe que a análise / formatação não faz parte do padrão, é necessário determinar o padrão e como aplicá-lo)

Iterador (reconhecível por métodos comportamentais que retornam sequencialmente instâncias de um tipo diferente de uma fila)

Mediador (reconhecível por métodos comportamentais que tomam uma instância de tipo abstrato / interface diferente (geralmente usando o padrão de comando) que delega / usa a instância especificada)

Memento (reconhecível por métodos comportamentais que alteram internamente o estado de toda a instância)

Observador (ou Publicar / Assinar) (reconhecível por métodos comportamentais que chama um método em uma instância de outro tipo de resumo / interface, dependendo do próprio estado)

Estado (reconhecível por métodos comportamentais que alteram seu comportamento, dependendo do estado da instância que pode ser controlado externamente)

Estratégia (reconhecível por métodos comportamentais em um tipo de resumo / interface que chama um método em uma implementação de um tipo de resumo / interface diferente que foi passado como argumento de método para a implementação da estratégia)

Método de modelo (reconhecível por métodos comportamentais que já possuem um comportamento "padrão" definido por um tipo abstrato)

Visitor (reconhecível por dois tipos abstratos / de interface diferentes, que possuem métodos definidos, que levam um ao outro tipo de resumo / interface; um chama o método do outro e o outro executa a estratégia desejada)

BalusC
fonte
23
impressionante .. :) +1. javax.lang.model.elementdefine visitantes;) Não tenho certeza se são doXXXou doFilternão "estratégias".
Bozho
16
Os construtores mencionados, por exemplo, StrinbgBuilder, não são um exemplo para o Builder-Pattern. É um erro muito comum, no entanto, considerá-los como construtores (assim você não é realmente a culpa ^ _ ^)
Anjo O'Sphere
77
@ BalusC, tenho uma pergunta a fazer. Você leu o código fonte INTEIRO de Java e JSF?
Tapas Bose
20
@Tapas: Eu não li tudo, apenas as partes que eu precisava, ou fiquei curioso para saber como elas "fizeram".
precisa saber é o seguinte
7
A maioria dos exemplos em "Método de fábrica" ​​são exemplos de "fábrica estática", que não é um padrão GoF. Incorreto.
portador do anel
107
  1. Padrão do observador em todo o balanço ( Observable, Observer)
  2. MVC também em balanço
  3. Padrão Adapter: InputStreamReader e OutputStreamWriter NOTA: ContainerAdapter, ComponentAdapter, FocusAdapter, KeyAdapter, MouseAdaptersão não adaptadores; eles são na verdade objetos nulos. Má escolha de nomes pelo sol.
  4. Padrão do decorador ( BufferedInputStreampode decorar outros fluxos, como FilterInputStream)
  5. AbstractFactory Pattern para o AWT Toolkit e as classes de aparência e toque conectáveis ​​ao Swing
  6. java.lang.Runtime#getRuntime() é Singleton
  7. ButtonGroup para padrão Mediador
  8. Action, AbstractActionpode ser usado para diferentes representações visuais para executar o mesmo código -> Padrão de comando
  9. Strings Internas ou CellRender no JTable para Flyweight Pattern (Pense também em vários pools - pools de encadeamentos, pools de conexão, pools de objetos EJB - Flyweight é realmente sobre gerenciamento de recursos compartilhados)
  10. O modelo de evento Java 1.0 é um exemplo de cadeia de responsabilidade, assim como os filtros de servlet.
  11. Padrão Iterator no Framework de Coleções
  12. Contêineres aninhados no AWT / Swing usam o padrão Composto
  13. Os gerentes de layout no AWT / Swing são um exemplo de estratégia

e muito mais eu acho

jitter
fonte
1
Obrigado pela dica no MouseAdapter. Eu encontrei este exaplanation: stackoverflow.com/questions/9244185/…
Lincoln
Observe que o Swing é apenas vagamente baseado no MVC. Recolheu o View and Controller em uma classe.
Matthias Braun
51
  1. Flyweight é usado com alguns valores de Byte, Curto, Inteiro, Longo e String.
  2. O Facade é usado em muitos lugares, mas o mais óbvio são as interfaces de script.
  3. Singleton - java.lang.Runtime vem à mente.
  4. Fábrica abstrata - também scripts e API JDBC.
  5. Comando - Desfazer / Refazer do TextComponent.
  6. Intérprete - API RegEx (java.util.regex. ) E SQL (java.sql. ).
  7. Protótipo - Não tenho 100% de certeza se isso conta, mas acho que o clone()método pode ser usado para esse fim.
NawaMan
fonte
1
Em relação ao padrão Flyweight : pode haver diferentes gerenciadores de layout java.awte java.swingpacotes. Na verdade, eles compartilham atributos intrínsecos quase idênticos e atributos extrínsecos são componentes diferentes da interface do usuário que eles apresentam no formato da interface do usuário.
Vitaly
@NawaMan Você disse 5. Comand TextComponent's Undo / Redo. Eu acho que é memento não comando. Ou provavelmente ambos.
Stimpson Cat
Você poderia me ajudar em uma pergunta relacionada - stackoverflow.com/questions/61284856/… . Usei o padrão de comando neste exemplo simples, mas não tenho certeza se é o caminho certo para resolver meu problema.
Tom Joe
42

O RMI é baseado em Proxy.

Deve ser possível citar um para a maioria dos 23 padrões no GoF:

  1. Fábrica abstrata: todas as interfaces java.sql obtêm suas implementações concretas do JDBC JAR quando o driver é registrado.
  2. Construtor: java.lang.StringBuilder.
  3. Método de Fábrica: Fábricas XML, entre outras.
  4. Protótipo: Talvez clone (), mas não tenho certeza se estou comprando.
  5. Singleton: java.lang.System
  6. Adaptador: Classes de adaptadores em java.awt.event, por exemplo, WindowAdapter.
  7. Bridge: Classes de coleção em java.util. Lista implementada por ArrayList.
  8. Composto: java.awt. java.awt.Component + java.awt.Container
  9. Decorador: Em todo o pacote java.io.
  10. Fachada: ExternalContext se comporta como uma fachada para executar cookies, escopo de sessão e operações semelhantes.
  11. Flyweight: Inteiro, Caráter, etc.
  12. Proxy: pacote java.rmi
  13. Cadeia de responsabilidade: filtros de servlet
  14. Comando: itens de menu Swing
  15. Intérprete: Não diretamente no JDK, mas o JavaCC certamente usa isso.
  16. Iterador: interface java.util.Iterator; não pode ser mais claro que isso.
  17. Mediador: JMS?
  18. Lembrança:
  19. Observador: java.util.Observer/Observable (mal feito, no entanto)
  20. Estado:
  21. Estratégia:
  22. Modelo:
  23. Visitante:

Não consigo pensar em exemplos em Java para 10 dos 23, mas vou ver se posso fazer melhor amanhã. É para isso que serve a edição.

duffymo
fonte
28

O padrão Abstract Factory é usado em vários lugares. Por exemplo, DatagramSocketImplFactory, PreferencesFactory. Existem muitos outros --- pesquise no Javadoc interfaces que tenham a palavra "Factory" em seu nome.

Também existem algumas instâncias do padrão Factory também.

uckelman
fonte
22

Embora eu esteja meio que com um relógio quebrado, a API Java XML usa muito o Factory. Quero dizer, basta olhar para isso:

Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(source);
String title = XPathFactory.newInstance().newXPath().evaluate("//title", doc);

...e assim por diante.

Além disso, vários buffers (StringBuffer, ByteBuffer, StringBuilder) usam o Builder.

Esko
fonte
21

java.util.Collection # Iterator é um bom exemplo de um método de fábrica. Dependendo da subclasse concreta de Collection usada, ele criará uma implementação de Iterator. Como a superclasse Factory (Collection) e o Iterator criados são interfaces, às vezes é confundido com AbstractFactory. A maioria dos exemplos de AbstractFactory na resposta aceita (BalusC) são exemplos de Factory , uma versão simplificada do Factory Method, que não faz parte dos padrões GoF originais. No Facory, a hierarquia da classe Factory é reduzida e a fábrica usa outros meios para escolher o produto a ser devolvido.

  • Fábrica abstrata

Uma fábrica abstrata possui vários métodos de fábrica, cada um criando um produto diferente. Os produtos produzidos por uma fábrica devem ser usados ​​juntos (é melhor que a impressora e os cartuchos sejam da mesma fábrica (abstrata)). Como mencionado nas respostas acima, as famílias de componentes da GUI do AWT, que diferem de plataforma para plataforma, são um exemplo disso (embora sua implementação seja diferente da estrutura descrita em Gof).

Catweazle
fonte