--- title: Design Patterns localeTitle: Padrões de design --- ## Padrões de design Um padrão de design é uma solução de design comum para um problema comum de projeto. Uma coleção de padrões de design para um campo ou domínio relacionado é chamada de linguagem de padrão. Observe que também há padrões em outros níveis: código, simultaneidade, arquitetura, design de interação… Na engenharia de software, um padrão de design de software é uma solução geral reutilizável para um problema comum em um determinado contexto no design de software. Não é um projeto acabado que pode ser transformado diretamente em código fonte ou máquina. É uma descrição ou modelo de como resolver um problema que pode ser usado em muitas situações diferentes. Os padrões de projeto são as melhores práticas formalizadas que o programador pode usar para resolver problemas comuns ao projetar um aplicativo ou sistema. Os padrões de design orientados a objetos geralmente mostram relacionamentos e interações entre classes ou objetos, sem especificar as classes ou objetos finais de aplicativo envolvidos. Padrões que implicam estados mutáveis ​​podem ser inadequados para linguagens de programação funcionais, alguns padrões podem ser tornados desnecessários em linguagens que têm suporte embutido para resolver o problema que estão tentando resolver, e padrões orientados a objetos não são necessariamente adequados para não-objetos. idiomas orientados. Padrões de design podem ser vistos como uma abordagem estruturada para programação de computadores intermediários entre os níveis de um paradigma de programação e um algoritmo concreto. O livro que popularizou o campo são os **Padrões de Design** da Gang of Four (GoF) **: Elementos do Software Orientado a Objetos Reutilizáveis** (1994). Apresenta uma série (23) de padrões para uma linguagem OO convencional (C ++) classificada em três tipos: * **Criacional** (para criar objetos): fábrica abstrata, construtor, método de fábrica, protótipo, singleton. * **Estrutural** (para compor objetos): adaptador, ponte, compósito, decorador, fachada, flyweight, proxy. * **Comportamental** (para comunicação entre objetos): cadeia de responsabilidade, comando, intérprete, iterador, mediador, memmento, observador, estado, estratégia, método de modelo, visitante. Os padrões podem ser usados ​​para vários objetivos (aprendizagem, comunicação, aprimoramento de suas ferramentas), mas em agilidade eles devem ser refatorados do código com dívida técnica e não apenas adicionados no início (design / arquitetura emergente), pois você não tem conhecimento suficiente sobre o (futuro) sistema que vai evoluir. Observe que o que requer um padrão em um idioma ou ferramenta pode não ser necessário ou já fazer parte de outro idioma ou ferramenta. Uma estrutura é um conjunto de classes cooperantes que compõem um design reutilizável para um tipo específico de software e geralmente são pesadas em padrões. #### Mais Informações: * [Wikipedia sobre padrões de design](https://en.wikipedia.org/wiki/Software_design_pattern) * [Wikipedia no GoF Book](https://en.wikipedia.org/wiki/Design_Patterns) * [Padrões de Design por Criação de Fonte](https://sourcemaking.com/design_patterns) : lista de padrões conhecidos disponíveis on-line * [Padrões de Programação de Jogos](http://gameprogrammingpatterns.com/) : livro sobre Padrões de Design comumente usados ​​no Desenvolvimento de Jogos, disponível para ser lido online gratuitamente * [Design Orientado a Objetos](http://www.oodesign.com/) * [Um guia para iniciantes em design de padrões](https://code.tutsplus.com/articles/a-beginners-guide-to-design-patterns--net-12752) * [De padrões de design à teoria de categorias](http://blog.ploeh.dk/2017/10/04/from-design-patterns-to-category-theory/)