Objetivo: Garantir que uma classe tenha apenas uma única instância e fornecer um ponto global de acesso a ela.
Obs.: Se for necessário implementar outros métodos no singleton, eles podem ser aplicados normalmente como em qualquer outra classe.
Exemplo em PHP:
class ConectorSingleton {
# Atributo privado e estático com o mesmo nome da classe usado para armazenar o Singleton
private static ?ConectorSingleton $ConectorSingleton = null;
private array $configuracoes = []; // Esse array é um atributo opcional que usei pra explicar implementação de métodos adicionais
# Construtor privado para evitar criação direta
private function __construct() {}
# Método estático para obter a instância única
public static function getInstancia(): ConectorSingleton {
if (self::$ConectorSingleton === null) {
self::$ConectorSingleton = new ConectorSingleton();
}
return self::$ConectorSingleton;
}
# Método para adicionar uma configuração ao conector do bd
public function setConfiguracao(string $chave, mixed $valor): void {
$this->configuracoes[$chave] = $valor;
}
# Método para obter uma configuração setada
public function getConfiguracao(string $chave): mixed {
return $this->configuracoes[$chave] ?? null;
}
# Método para remover uma configuração setada
public function removeConfiguracao(string $chave): void{
unset($this->configuracoes[$chave]);
}
}
# Uso
$conectorBD = ConectorSingleton::getInstancia();
$conectorBD->setConfiguracao('db_host', 'localhost');
$conectorBD->setConfiguracao('db_user', 'root');
echo $conectorBD->getConfiguracao('db_host'); // localhost
$cconectorBD2 = ConectorSingleton::getInstancia();
echo $cconectorBD2->getConfiguracao('db_user'); // root
Objetivo: Fornecer uma interface simplificada para um conjunto de subsistemas complexos. O padrão Facade centraliza a implementação de várias classes e métodos em apenas uma classe.
Exemplo em php
# Primeira classe
class Estoque {
public function verificarEstoque(int $produtoId): string{
return "Produto $produtoId disponível no estoque.\n";
}
}
# Segunda classe
class Pagamento {
public function processarPagamento(float $valor): string {
return "Pagamento de R$ $valor processado.\n";
}
}
# Terceira classe
class Envio {
public function organizarEnvio(int $produtoId): string {
return "Produto $produtoId preparado para envio.\n";
}
}
# Classe Facade para encapsular as três classes acima, criando uma implementação única que garanta (1) a sequencialidade
# das operações e (2) simplifique a implementação das classes acima.
class PedidoFacade {
# Um atributo para cada classe que desejamos implementar
private Estoque $estoque;
private Pagamento $pagamento;
private Envio $envio;
# Construtor que implementa todas as classes
public function __construct() {
$this->estoque = new Estoque();
$this->pagamento = new Pagamento();
$this->envio = new Envio();
}
# Método que realiza todas as operações
public function processarPedido(int $produtoId, float $valor): string {
$result = $this->estoque->verificarEstoque($produtoId);
$result .= $this->pagamento->processarPagamento($valor);
$result .= $this->envio->organizarEnvio($produtoId);
return $result;
}
}
# Uso
$pedido = new PedidoFacade();
echo $pedido->processarPedido(123, 150.00);
Objetivo: Permitir que objetos observadores sejam notificados automaticamente sempre que o objeto observado sofrer mudanças.
Exemplo em php:
# Interface que será aplicada nas classes desejadas
interface Observer {
# Método que será implementado pelas classes que observam notificações
public function notificar(string $mensagem): void;
}
# Classe que implementará a interface Observer
class Usuario implements Observer {
private string $nome; // Atributo para armazenar o nome do usuário
# Construtor para inicializar o nome do usuário
public function __construct(string $nome) {
$this->nome = $nome;
}
# Implementação do método notificar, definido na interface Observer
# Esse método será chamado para enviar notificações ao usuário
public function notificar(string $mensagem): void {
echo "Notificação para {$this->nome}: {$mensagem}\n";
}
}
# Classe Blog que será o sujeito "observado" pelos usuários
class Blog {
private array $inscritos = []; // Lista de objetos que implementam Observer (usuários inscritos)
private array $artigos = []; // Lista de artigos publicados no blog
# Método para inscrever um usuário no blog
public function inscrever(Observer $usuario): void {
$this->inscritos[] = $usuario; // Adiciona o usuário na lista de inscritos
}
# Método para publicar um novo artigo
public function publicarArtigo(string $titulo): void {
$this->artigos[] = $titulo; // Armazena o título do novo artigo
$this->notificarUsuarios("Novo artigo publicado: $titulo"); // Notifica os inscritos sobre o novo artigo
}
# Método privado para notificar todos os usuários inscritos
private function notificarUsuarios(string $mensagem): void {
# Itera sobre todos os inscritos e chama o método notificar para cada um
foreach ($this->inscritos as $usuario) {
$usuario->notificar($mensagem);
}
}
}
// Uso
// Cria dois usuários com os nomes João e Maria
$usuario1 = new Usuario("João");
$usuario2 = new Usuario("Maria");
// Cria uma instância da classe Blog
$blog = new Blog();
// Inscreve os usuários no blog
$blog->inscrever($usuario1);
$blog->inscrever($usuario2);
// Publica um novo artigo e notifica os inscritos
$blog->publicarArtigo("Introdução ao PHP");