{"id":18369000,"url":"https://github.com/claudio-code/design-patterns","last_synced_at":"2025-04-10T19:39:27.524Z","repository":{"id":115886094,"uuid":"269873945","full_name":"Claudio-code/design-patterns","owner":"Claudio-code","description":":heavy_check_mark: Aprendendo os padões de projeto com :elephant: e documentando.","archived":false,"fork":false,"pushed_at":"2021-09-07T20:50:05.000Z","size":133,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-15T20:54:13.940Z","etag":null,"topics":["design-patterns","oop-principles","oriented-object-programming","php"],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Claudio-code.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-06-06T05:03:17.000Z","updated_at":"2021-09-07T20:50:08.000Z","dependencies_parsed_at":null,"dependency_job_id":"3a06d5bd-b704-4b86-b63c-1ade86604b78","html_url":"https://github.com/Claudio-code/design-patterns","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Claudio-code%2Fdesign-patterns","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Claudio-code%2Fdesign-patterns/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Claudio-code%2Fdesign-patterns/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Claudio-code%2Fdesign-patterns/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Claudio-code","download_url":"https://codeload.github.com/Claudio-code/design-patterns/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248281424,"owners_count":21077423,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["design-patterns","oop-principles","oriented-object-programming","php"],"created_at":"2024-11-05T23:28:06.853Z","updated_at":"2025-04-10T19:39:27.494Z","avatar_url":"https://github.com/Claudio-code.png","language":"PHP","readme":"\u003ch1 align=\"center\"\u003e\n  Design Patterns\n\u003c/h1\u003e\n\n# :bookmark_tabs: Índice\n\n- [Objetivo](#objetivo)\n\n- Padrões de Criação\n    - [Singleton](#singleton)\n    - [Builder](#builder)\n    - [Factory Method](#factoryMethod)\n    - [Abstract Factory](#abstractFactory)\n    - [Prototype](#prototype)\n\n- Padrões Estruturais \n    - [Adapter](#adapter)\n    - [Decorator](#decorator)\n    - [Proxy](#proxy)\n    - [Bridge](#bridge)\n    - [Composite](#composite)\n    - [Façade](#facade)\n    - [Flyweight](#flyweight)\n\n- Padrões Comportamento\n    - [Strategy](#strategy)\n    - [Chain of Responsibility](#chainOfResponsibility)\n    - [Command](#command)\n    - [State](#state)\n    - [Observer](#observer)\n    - [Mediator](#mediator)\n    - [Template Method](#templateMethod)\n    - [Interpreter](#interpreter)\n    - [Memento](#memento)\n\n\u003cbr\u003e\u003cbr\u003e\n\u003ca id=\"objetivo\"\u003e\u003c/a\u003e\n## :dart: Objetivo\n\n- Aqui foram implementados os padrões de projeto mais usados com a última especificação da linguagem \u003cb\u003ePHP\u003c/b\u003e para fins de estudo.\n\n\u003chr\u003e\n\n\u003ca id=\"singleton\"\u003e\u003c/a\u003e\n## :gem: Singleton \u003cbr\u003e\n\n#### Estrutura principal\n\n- Método construtor é privado.\n- Método \"getInstance\" responsável por criar o objeto.\n- Ele verifica se o objeto existe, caso contrario cria.\n- Possui outros métodos como uma classe qualquer.\n\n#### Motivação\n\n- Uma única conexão com o banco de dados.\n- Um único acesso ao sistema de arquivos do sistema.\n- Sistema de logs.\n- Não há parâmetros para a sua construção.\n- Acessível de uma forma global.\n\n#### Consequências =\u003e Singleton como um Anti-Pattern\n\n- Alto acoplamento.\n- Acesso global de um objeto.\n- Não é thread safe.\n- Dificuldade para trabalhar com testes.\n\n\u003chr\u003e\n\n\u003ca id=\"adapter\"\u003e\u003c/a\u003e\n## :wrench: Adapter \u003cbr\u003e\n\n#### Motivação\n\n- Converte a ‘interface’ de uma classe em outra que é esperada pelo cliente.\n- Permitir que a classe que não possuem uma ‘interface’ comum trabalhem de forma conjunta.\n- Deixar a possibilidade de futuras implementações para o cliente provendo uma ‘interface’ para os seus adaptadores.\n\n#### Conceito\n\n- Client - é quem vai receber o produto do adapter.\n- Target - é o alvo, é a interface que o cliente tem que implementar.\n- Adapter - é quem vai implementar a interface na classe cliente.\n\n\u003chr\u003e\n\n\u003ca id=\"decorator\"\u003e\u003c/a\u003e\n## :christmas_tree: Decorator \u003cbr\u003e\n\n#### Motivação\n\n- Uma alternativa para a criação de subclasses para estender funcionalidades. A intenção é anexar dinamicamente responsabilidades adicionais flexíveis a um objeto.\n- Aprimorar a extensibilidade do objeto, pois as alterações são feitas a codificar novas classes.\n- Simplifica o desenvolvimento permitindo uma série de classes com funcionalidades específicas, ao invés de codificar todo o comportamento do objeto.\n\n\u003chr\u003e\n\n\u003ca id=\"builder\"\u003e\u003c/a\u003e\n## :package: Builder \u003cbr\u003e\n\n#### Motivação\n\n- Permite que a separação da construção de um objeto complexo da sua representação.\n- Permite que uma classe se preocupe com apenas uma parte da construção de um objeto. É util em algoritmos de construção complexos.\n    - É 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.\n- Também suporta substituição dos construtores, permitindo que a mesma ‘interface’ seja usada para construir representações diferentes dos mesmos dados.\n    - è usado quando o processo de construção precisar suportar representações diferentes do objeto que vai ser construido.\n\n\u003chr\u003e\n\n\u003ca id=\"strategy\"\u003e\u003c/a\u003e\n## :dart: Strategy \u003cbr\u003e\n\n#### Motivação\n\n- Definir um grupo de algoritmos, encapsular cada um, e fazê-los intercambiáveis através de uma ‘interface’. \n- Assim permitindo que eles mudem independentemente entre os clientes que os utilizam. \n\n\u003chr\u003e\n\n\u003ca id=\"chainOfResponsibility\"\u003e\u003c/a\u003e\n## :bomb: Chain of Responsibility \u003cbr\u003e\n\n#### Motivação\n\n- Evita dependência do remetente(cliente) de uma requisição ao seu destinatário.\n- 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.\n- Compõe os objetos em cascata e passa a requisição pela corrente até que um objeto sirva.\n\n\u003chr\u003e\n\n\n\u003ca id=\"factoryMethod\"\u003e\u003c/a\u003e\n## :star2: Factory Method \u003cbr\u003e\n\n#### Motivação\n\n- Definir uma ‘interface’ para criar um objeto, mas deixa as subclasses decidirem que classe instanciar.\n- Criar uma instância de várias classes derivadas.\n\n\u003chr\u003e\n\n\n\u003ca id=\"abstractFactory\"\u003e\u003c/a\u003e\n## :star2: Abstract Factory \u003cbr\u003e\n\n#### Motivação\n\n- Fornecer uma ‘interface’ para criação de famílias de objetos relacionados ou dependentes sem especificar as suas classes concretas.\n- Cria uma instância de várias famílias de classes.\n\n\u003chr\u003e\n\n\u003ca id=\"prototype\"\u003e\u003c/a\u003e\n## :station: Prototype \u003cbr\u003e\n\n#### Motivação\n\n- Especifica os objetos a serem criados usados uma instância do protótipo e criar objetos pela cópia deste protótipo.\n- Uma instância a ser copiada ou clonada.\n\n\u003chr\u003e\n\n\u003ca id=\"bridge\"\u003e\u003c/a\u003e\n## :bridge_at_night: Bridge\n\n#### Motivação\n\n- Separar o objeto de sua representação e de usa implementação, separando ele em objeto, implementação e a sua abstração.\n\n\u003chr\u003e\n\n\u003ca id=\"proxy\"\u003e\u003c/a\u003e\n## :part_alternation_mark: Proxy\n\n#### Motivação\n\n- Fornece um substituto (surrogate) ou marcador da localização de outro objeto para controlar o acesso ao mesmo.\n- Faz um objeto ser representado por outro.\n\n\u003chr\u003e\n\n\u003ca id=\"composite\"\u003e\u003c/a\u003e\n## :open_hands: Composite\n\n#### Motivação\n\n- Compor objetos em estruturas de árvore para representarem hierarquias partes do todo.\n- O composite permite aos clientes tratarem de maneira uniforme objetos individuais e composições de objetos.\n\n\u003ca id=\"facade\"\u003e\u003c/a\u003e\n## :tada: Façade\n\n\u003chr\u003e\n\n#### Motivação\n\n- Fornecer uma ‘interface’ unificada para um conjunto de ‘interfaces’ num subsistema.\n- Façade define uma ‘interface’ de nível mais alto que torna o subsistema mais fácil de ser usado.\n- Uma única classe representa um subsistema inteiro.\n\n\u003chr\u003e\n\n\u003ca id=\"flyweight\"\u003e\u003c/a\u003e\n## :balloon: Flyweight\n\n#### Motivação\n\n- Usa o compartilhamento para suportar eficientemente grandes quantidades de objetos de granularidade fina.\n\n\u003chr\u003e\n\n\u003ca id=\"command\"\u003e\u003c/a\u003e\n## :balloon: Command\n\n#### Motivação\n\n- Encapsular uma solicitação como um objeto, desta forma permitindo parametrizar clientes com diferentes solicitações.\n- Enfileirar ou fazer o registro de solicitações e suportar operações que podem ser desfeitas.\n- Encapsular comandos como um objeto.\n\n\u003chr\u003e\n\n\u003ca id=\"state\"\u003e\u003c/a\u003e\n## :smile: State\n\n#### Motivação\n\n- Permite a um objeto alterar seu comportamento quando o seu estado interno muda. O objeto parecera ter mudado sua classe.\n- Alterar o comportamento de um objeto quando seu estado muda.\n\n\u003chr\u003e\n\n\u003ca id=\"observer\"\u003e\u003c/a\u003e\n## :flushed: Observer\n\n#### Motivação\n\n- 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.\n\n\u003chr\u003e\n\n\u003ca id=\"mediator\"\u003e\u003c/a\u003e\n## :eyes: Mediator\n\n#### Motivação\n\n- 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.\n- Definir uma comunicação simplificada entre as classes.\n\n\u003chr\u003e\n\n\u003ca id=\"templateMethod\"\u003e\u003c/a\u003e\n## :eyes: Template Method\n\n#### Motivação\n\n- 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.\n\n\u003chr\u003e\n\n\u003ca id=\"interpreter\"\u003e\u003c/a\u003e\n## :suspect: Interpreter\n\n#### Motivação\n\n- 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.\n- Uma forma de incluir elementos da linguagem num programa.\n- Usa classes para representar cada regra de uma gramática (expressão regular).\n\n\u003chr\u003e\n\n\u003ca id=\"memento\"\u003e\u003c/a\u003e\n## :trollface: Memento\n\n#### Motivação\n\n- 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.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclaudio-code%2Fdesign-patterns","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fclaudio-code%2Fdesign-patterns","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fclaudio-code%2Fdesign-patterns/lists"}