An open API service indexing awesome lists of open source software.

https://github.com/claudio-code/design-patterns

:heavy_check_mark: Aprendendo os padões de projeto com :elephant: e documentando.
https://github.com/claudio-code/design-patterns

design-patterns oop-principles oriented-object-programming php

Last synced: 8 months ago
JSON representation

:heavy_check_mark: Aprendendo os padões de projeto com :elephant: e documentando.

Awesome Lists containing this project

README

          


Design Patterns

# :bookmark_tabs: Índice

- [Objetivo](#objetivo)

- Padrões de Criação
- [Singleton](#singleton)
- [Builder](#builder)
- [Factory Method](#factoryMethod)
- [Abstract Factory](#abstractFactory)
- [Prototype](#prototype)

- Padrões Estruturais
- [Adapter](#adapter)
- [Decorator](#decorator)
- [Proxy](#proxy)
- [Bridge](#bridge)
- [Composite](#composite)
- [Façade](#facade)
- [Flyweight](#flyweight)

- Padrões Comportamento
- [Strategy](#strategy)
- [Chain of Responsibility](#chainOfResponsibility)
- [Command](#command)
- [State](#state)
- [Observer](#observer)
- [Mediator](#mediator)
- [Template Method](#templateMethod)
- [Interpreter](#interpreter)
- [Memento](#memento)





## :dart: Objetivo

- Aqui foram implementados os padrões de projeto mais usados com a última especificação da linguagem PHP para fins de estudo.



## :gem: Singleton

#### Estrutura principal

- Método construtor é privado.
- Método "getInstance" responsável por criar o objeto.
- Ele verifica se o objeto existe, caso contrario cria.
- Possui outros métodos como uma classe qualquer.

#### Motivação

- Uma única conexão com o banco de dados.
- Um único acesso ao sistema de arquivos do sistema.
- Sistema de logs.
- Não há parâmetros para a sua construção.
- Acessível de uma forma global.

#### Consequências => Singleton como um Anti-Pattern

- Alto acoplamento.
- Acesso global de um objeto.
- Não é thread safe.
- Dificuldade para trabalhar com testes.



## :wrench: Adapter

#### Motivação

- Converte a ‘interface’ de uma classe em outra que é esperada pelo cliente.
- Permitir que a classe que não possuem uma ‘interface’ comum trabalhem de forma conjunta.
- Deixar a possibilidade de futuras implementações para o cliente provendo uma ‘interface’ para os seus adaptadores.

#### Conceito

- Client - é quem vai receber o produto do adapter.
- Target - é o alvo, é a interface que o cliente tem que implementar.
- Adapter - é quem vai implementar a interface na classe cliente.



## :christmas_tree: Decorator

#### Motivação

- Uma alternativa para a criação de subclasses para estender funcionalidades. A intenção é anexar dinamicamente responsabilidades adicionais flexíveis a um objeto.
- Aprimorar a extensibilidade do objeto, pois as alterações são feitas a codificar novas classes.
- Simplifica o desenvolvimento permitindo uma série de classes com funcionalidades específicas, ao invés de codificar todo o comportamento do objeto.



## :package: Builder

#### Motivação

- Permite que a separação da construção de um objeto complexo da sua representação.
- Permite que uma classe se preocupe com apenas uma parte da construção de um objeto. É util em algoritmos de construção complexos.
- É usado quando o algoritmo para criar um objeto complexo precisar ser independente das partes que o compõem e da mesma forma como o ele é construido.
- Também suporta substituição dos construtores, permitindo que a mesma ‘interface’ seja usada para construir representações diferentes dos mesmos dados.
- è usado quando o processo de construção precisar suportar representações diferentes do objeto que vai ser construido.



## :dart: Strategy

#### Motivação

- Definir um grupo de algoritmos, encapsular cada um, e fazê-los intercambiáveis através de uma ‘interface’.
- Assim permitindo que eles mudem independentemente entre os clientes que os utilizam.



## :bomb: Chain of Responsibility

#### Motivação

- Evita dependência do remetente(cliente) de uma requisição ao seu destinatário.
- Evita acoplar o remetente de uma requisição ao seu destinatário ao dar a mais de um objeto a oportunidade de servir a requisição.
- Compõe os objetos em cascata e passa a requisição pela corrente até que um objeto sirva.



## :star2: Factory Method

#### Motivação

- Definir uma ‘interface’ para criar um objeto, mas deixa as subclasses decidirem que classe instanciar.
- Criar uma instância de várias classes derivadas.



## :star2: Abstract Factory

#### Motivação

- Fornecer uma ‘interface’ para criação de famílias de objetos relacionados ou dependentes sem especificar as suas classes concretas.
- Cria uma instância de várias famílias de classes.



## :station: Prototype

#### Motivação

- Especifica os objetos a serem criados usados uma instância do protótipo e criar objetos pela cópia deste protótipo.
- Uma instância a ser copiada ou clonada.



## :bridge_at_night: Bridge

#### Motivação

- Separar o objeto de sua representação e de usa implementação, separando ele em objeto, implementação e a sua abstração.



## :part_alternation_mark: Proxy

#### Motivação

- Fornece um substituto (surrogate) ou marcador da localização de outro objeto para controlar o acesso ao mesmo.
- Faz um objeto ser representado por outro.



## :open_hands: Composite

#### Motivação

- Compor objetos em estruturas de árvore para representarem hierarquias partes do todo.
- O composite permite aos clientes tratarem de maneira uniforme objetos individuais e composições de objetos.


## :tada: Façade


#### Motivação

- Fornecer uma ‘interface’ unificada para um conjunto de ‘interfaces’ num subsistema.
- Façade define uma ‘interface’ de nível mais alto que torna o subsistema mais fácil de ser usado.
- Uma única classe representa um subsistema inteiro.



## :balloon: Flyweight

#### Motivação

- Usa o compartilhamento para suportar eficientemente grandes quantidades de objetos de granularidade fina.



## :balloon: Command

#### Motivação

- Encapsular uma solicitação como um objeto, desta forma permitindo parametrizar clientes com diferentes solicitações.
- Enfileirar ou fazer o registro de solicitações e suportar operações que podem ser desfeitas.
- Encapsular comandos como um objeto.



## :smile: State

#### Motivação

- Permite a um objeto alterar seu comportamento quando o seu estado interno muda. O objeto parecera ter mudado sua classe.
- Alterar o comportamento de um objeto quando seu estado muda.



## :flushed: Observer

#### Motivação

- Definir uma dependência um-para-muitos entre objetos, de maneira que quando um objeto muda de estado todos os seus dependentes são notificados e atualizados automaticamente.



## :eyes: Mediator

#### Motivação

- Definir um objeto que encapsula a forma como um conjunto de objetos interage O Mediator promove o acoplamento fraco ao evitar que os objetos se refiram uns aos outros explicitamente e permite variar as suas interações independentemente.
- Definir uma comunicação simplificada entre as classes.



## :eyes: Template Method

#### Motivação

- Definir o esqueleto de um algoritmo numa operação, postergando alguns passos para a subclasse esse padrão permite que subclasses definam certos passos de um algoritmo sem mudar a estrutura do mesmo.



## :suspect: Interpreter

#### Motivação

- Dada uma linguagem, definir uma representação para a sua gramática com um interpretador que usa representação para interpretar sentenças da linguagem.
- Uma forma de incluir elementos da linguagem num programa.
- Usa classes para representar cada regra de uma gramática (expressão regular).



## :trollface: Memento

#### Motivação

- Sem violar o encapsulamento, capturar e externalizar um estado interno de um objeto, de maneira que o objeto possa ser restaurado para este estado mais tarde.