Este diretório contém implementações de padrões de projeto em PHP 8.2. Abaixo você encontrará um índice para cada padrão implementado, com uma explicação detalhada do código correspondente. Clique no nome do padrão para ser redirecionado ao código-fonte.
-
Factory Method
O padrão Factory Method fornece uma interface para criar objetos em uma superclasse, mas permite que as subclasses alterem o tipo de objeto que será criado.Explicação do Código:
O exemplo demonstra como diferentes criadores concretos (ConcreteCreatorA
eConcreteCreatorB
) implementam o métodoFactoryMethod()
para retornar produtos específicos (ConcreteProductA
eConcreteProductB
). O cliente interage com o criador através da interfaceCreator
e recebe produtos sem precisar conhecer as classes concretas. -
Abstract Factory
O padrão Abstract Factory fornece uma interface para criar famílias de objetos relacionados ou dependentes sem especificar suas classes concretas.Explicação do Código:
O exemplo demonstra como fábricas concretas (ConcreteFactory1
eConcreteFactory2
) criam produtos relacionados (ConcreteProductA1
,ConcreteProductB1
, etc.). O cliente utiliza a fábrica abstrata para criar produtos, garantindo que os produtos criados sejam compatíveis entre si. -
Builder
O padrão Builder separa a construção de um objeto complexo de sua representação, permitindo que o mesmo processo de construção crie diferentes representações.Explicação do Código:
O exemplo ilustra como oDirector
constrói uma casa (House
) usando umConcreteHouseBuilder
. A interfaceHouseBuilder
define os métodos para construir as partes da casa, e oConcreteHouseBuilder
fornece a implementação para construir a casa peça por peça. -
Prototype
O padrão Prototype cria novos objetos ao clonar uma instância existente, conhecida como protótipo.Explicação do Código:
O exemplo mostra como objetos protótipo (ConcretePrototype1
eConcretePrototype2
) implementam a interfacePrototype
para permitir a clonagem. O métodoClone()
retorna uma nova instância que é uma cópia do protótipo original. -
Singleton
O padrão Singleton garante que uma classe tenha apenas uma instância e fornece um ponto global de acesso a ela.Explicação do Código:
O exemplo demonstra como a funçãogetInstance()
garante que apenas uma instância doSingleton
seja criada e usada durante toda a execução do programa. O uso destatic
assegura que a instância seja criada uma única vez.
-
Adapter
O padrão Adapter permite que interfaces incompatíveis trabalhem juntas, convertendo a interface de uma classe em outra interface que o cliente espera.Explicação do Código:
O exemplo demonstra como oAdapter
converte a interface doAdaptee
(specificRequest()
) em uma interface compatível com oTarget
(request()
). OClient
pode então usar oAdapter
para interagir com oAdaptee
através da interfaceTarget
. -
Bridge
O padrão Bridge desacopla uma abstração da sua implementação, permitindo que ambos possam variar independentemente.Explicação do Código:
O exemplo ilustra como aAbstraction
e sua implementação (Implementor
) podem variar independentemente. ARefinedAbstraction
usa umImplementor
para realizar operações, permitindo que diferentes implementações sejam usadas sem alterar a abstração. -
Composite
O padrão Composite permite que objetos sejam compostos em estruturas de árvore para representar hierarquias parte-todo. O Composite permite que os clientes tratem objetos individuais e composições de objetos de forma uniforme.Explicação do Código:
O exemplo mostra comoComposite
eLeaf
implementam a interfaceComponent
, permitindo queComposite
contenha uma coleção deComponents
. OClient
pode tratarLeaf
eComposite
da mesma forma, compondo hierarquias complexas de objetos. -
Decorator
O padrão Decorator permite que comportamentos sejam adicionados a objetos de maneira dinâmica, fornecendo uma alternativa flexível à herança para estender funcionalidades.Explicação do Código:
O exemplo demonstra comoConcreteComponent
pode ser decorado comConcreteDecoratorA
eConcreteDecoratorB
, que adicionam funcionalidades adicionais aoComponent
de maneira dinâmica, sem modificar o código doConcreteComponent
. -
Facade
O padrão Facade fornece uma interface simplificada para um conjunto de interfaces em um subsistema, tornando-o mais fácil de usar.Explicação do Código:
O exemplo mostra como aFacade
simplifica as interações com os subsistemas (SubsystemA
,SubsystemB
,SubsystemC
), permitindo que oClient
interaja com uma única interface, em vez de lidar com a complexidade dos subsistemas diretamente. -
Flyweight
O padrão Flyweight permite que muitos objetos similares compartilhem um único estado comum para economizar memória.Explicação do Código:
O exemplo demonstra como oFlyweightFactory
gerencia e compartilha instâncias deFlyweight
. Isso permite que objetos com estado compartilhado sejam reutilizados para economizar recursos, especialmente em aplicações que criam muitos objetos semelhantes. -
Proxy
O padrão Proxy fornece um substituto ou marcador para outro objeto, controlando o acesso a ele.Explicação do Código:
O exemplo mostra como oProxy
controla o acesso aoRealSubject
, adicionando funcionalidades como controle de acesso e registro de logs antes de delegar as solicitações aoRealSubject
.
-
Chain of Responsibility
O padrão Chain of Responsibility permite que mais de um objeto trate uma solicitação, desacoplando o remetente do receptor ao dar a chance a múltiplos objetos de processar a solicitação.Explicação do Código:
O exemplo demonstra como os manipuladores (ConcreteHandler1
,ConcreteHandler2
) são encadeados e processam uma solicitação. Cada manipulador decide se trata a solicitação ou a passa para o próximo na cadeia. -
Command
O padrão Command encapsula uma solicitação como um objeto, permitindo que você parametrize clientes com diferentes solicitações, enfileire ou registre solicitações e suporte operações que podem ser desfeitas.Explicação do Código:
O exemplo ilustra como comandos (ConcreteCommand1
,ConcreteCommand2
) encapsulam ações noReceiver
e permitem que oInvoker
execute as ações sem conhecer os detalhes de implementação. -
Interpreter
O padrão Interpreter define uma representação gramatical para uma linguagem e um interpretador para lidar com essa gramática.Explicação do Código:
O exemplo mostra como expressões (NumberExpression
,AdditionExpression
,SubtractionExpression
) podem ser interpretadas em uma linguagem específica. O código cliente demonstra como tokens são convertidos em expressões e então interpretados para calcular o resultado. -
Iterator
O padrão Iterator fornece uma maneira de acessar sequencialmente os elementos de uma coleção sem expor a sua representação subjacente.Explicação do Código:
O exemplo demonstra comoConcreteAggregate
cria umConcreteIterator
que itera sobre uma coleção de itens. O cliente usa o iterador para acessar os elementos da coleção sem precisar conhecer a estrutura interna da coleção. -
Mediator
O padrão Mediator define um objeto que encapsula como um conjunto de objetos interage, promovendo o desacoplamento desses objetos ao evitar que eles referenciem uns aos outros diretamente.Explicação do Código:
O exemplo ilustra como oConcreteMediator
gerencia a interação entreConcreteComponent1
eConcreteComponent2
, centralizando a comunicação e promovendo o desacoplamento entre os componentes. -
Memento
O padrão Memento captura e externaliza o estado interno de um objeto para que ele possa ser restaurado mais tarde sem violar o encapsulamento.Explicação do Código:
O exemplo demonstra como oOriginator
cria umMemento
para salvar seu estado e como oCaretaker
gerencia esses mementos. O cliente pode restaurar o estado anterior doOriginator
a partir de um memento armazenado. -
Observer
O padrão Observer define uma dependência um-para-muitos entre objetos, de forma que quando um objeto muda de estado, todos os seus dependentes são notificados e atualizados automaticamente.Explicação do Código:
O exemplo mostra como oConcreteSubject
notifica seus observadores (ConcreteObserver
) sobre mudanças de estado. Os observadores são automaticamente atualizados quando o estado do sujeito muda. -
State
O padrão State permite que um objeto altere seu comportamento quando seu estado interno muda, fazendo o objeto parecer mudar de classe.Explicação do Código:
O exemplo demonstra como oContext
muda de estado dinamicamente entreConcreteStateA
eConcreteStateB
, e como cada estado define um comportamento diferente para oContext
. -
Strategy
O padrão Strategy define uma família de algoritmos, encapsula cada um deles e os torna intercambiáveis.Explicação do Código:
O exemplo ilustra como oContext
pode usar diferentes estratégias (ConcreteStrategyAdd
,ConcreteStrategySubtract
,ConcreteStrategyMultiply
) para realizar operações de forma intercambiável. -
Template Method
O padrão Template Method define o esqueleto de um algoritmo na superclasse, mas permite que subclasses sobrescrevam etapas específicas do algoritmo sem alterar sua estrutura.Explicação do Código:
O exemplo mostra comoConcreteClassA
eConcreteClassB
implementam passos específicos de um algoritmo, enquanto a estrutura do algoritmo é definida naBaseClass
. -
Visitor
O padrão Visitor permite definir uma nova operação sem mudar as classes dos elementos sobre os quais opera.Explicação do Código:
O exemplo mostra como diferentes visitantes (ConcreteVisitor1
,ConcreteVisitor2
) podem operar sobre uma coleção de elementos (ConcreteElementA
,ConcreteElementB
), aplicando diferentes operações sem modificar os elementos.
Este arquivo serve como um guia para explorar e entender os diferentes padrões de projeto implementados em PHP 8.2. Cada link direciona você ao código-fonte do padrão, acompanhado de uma explicação detalhada para ajudar na compreensão do funcionamento de cada padrão.