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.");