No desenvolvimento orientado a objetos, a forma como criamos instâncias de classes pode determinar quĂŁo flexĂvel ou rĂgido um sistema será. Os padrões Singleton e Factory Method oferecem controle sobre esse processo, garantindo eficiĂŞncia e baixo acoplamento.
​1. Singleton: A Instância Única Link para o cabeçalho
​O Singleton é utilizado quando precisamos garantir que uma classe tenha apenas uma instância durante toda a execução do programa. Ele centraliza o acesso a um recurso compartilhado.
- ​Problema Comum: Criar múltiplas conexões com um banco de dados ou abrir vários arquivos de configuração desnecessariamente, consumindo memória e processamento.
- ​Solução: A prĂłpria classe gerencia sua instância Ăşnica e proĂbe a criação externa atravĂ©s de um construtor privado.
​2. Factory Method: Delegação de Instância Link para o cabeçalho
​O Factory Method (MĂ©todo Fábrica) fornece uma interface para criar objetos, mas permite que as subclasses decidam qual classe especĂfica instanciar.
- Problema Comum: O cĂłdigo principal fica “viciado” em classes concretas (ex: new MySQLConnection()), tornando difĂcil a troca para outro tipo (ex: PostgreSQL) sem alterar todo o sistema.
- ​Solução: Você define um método para criar o objeto, e as classes filhas sobrescrevem esse método para retornar a instância apropriada.
​Exemplo Prático em PHP Link para o cabeçalho
​Neste exemplo, usamos o Singleton para gerenciar a conexão com o banco de dados e o Factory Method para decidir qual tipo de log o sistema deve gerar.
<?php
// --- SINGLETON: ConexĂŁo com Banco de Dados ---
class Database {
private static $instance = null;
// Construtor privado impede 'new Database()' fora da classe
private function __construct() {
// LĂłgica de conexĂŁo aqui
}
public static function getInstance() {
if (self::$instance == null) {
self::$instance = new Database();
}
return self::$instance;
}
public function query($sql) {
return "Executando: $sql";
}
}
// --- FACTORY METHOD: Gerador de Logs ---
interface Logger {
public function log(string $message);
}
class FileLogger implements Logger {
public function log(string $message) {
echo "Log gravado no ARQUIVO: $message\n";
}
}
class DatabaseLogger implements Logger {
public function log(string $message) {
echo "Log gravado no BANCO: $message\n";
}
}
abstract class LogCreator {
abstract public function createLogger(): Logger;
public function executeLog($message) {
$logger = $this->createLogger();
$logger->log($message);
}
}
class FileLogCreator extends LogCreator {
public function createLogger(): Logger {
return new FileLogger();
}
}
// --- USO DO SISTEMA ---
// Usando Singleton
$db = Database::getInstance();
echo $db->query("SELECT * FROM users") . "\n";
// Usando Factory Method
$logSystem = new FileLogCreator();
$logSystem->executeLog("Usuário realizou login.");