Architecture

Padrões de Criação: Construindo Objetos com Flexibilidade

Domine a arte da criação flexível de objetos—descubra como padrões Factory, Builder, Singleton e Prototype resolvem o desafio fundamental de construir objetos desacoplados, testáveis e adaptáveis à mudança

Série: Padrões de Projeto e Análise | Parte 2 de 4 > Desenvolvido durante o Mestrado em Projetos de Sistemas Web

Continuando nossa série, após entender a importância dos padrões de projeto, agora exploramos a primeira categoria específica. Os padrões de criação resolvem um dos problemas mais fundamentais do design orientado a objetos.

Os padrões de criação resolvem um dos problemas mais fundamentais do design orientado a objetos: Como criamos objetos de forma flexível, desacoplada e testável?

Neste post, vamos explorar com mais profundidade a primeira categoria dos padrões de projeto — os Padrões de Criação — e entender suas ideias centrais, estruturas e quando aplicá-los em sistemas reais.

O Que São Padrões de Criação?

Esses padrões encapsulam o processo de criação de objetos, escondendo as complexidades da instanciação e tornando o código mais flexível para mudanças.

Eles ajudam a evitar:

  • Uso excessivo de new espalhado pelo código
  • Alto acoplamento com classes concretas
  • Problemas na configuração e duplicação de objetos

Tipos de Padrões de Criação

Factory Method

Cria objetos por meio de uma interface de fábrica em vez de instanciar diretamente com new.

  • Intenção: Definir uma interface para criação de objetos, deixando que subclasses decidam qual classe instanciar.
  • Use quando: Deseja delegar a criação para subclasses.
Diagrama UML do Factory Method
abstract class Dialog {
    public void renderWindow() {
        Button okButton = createButton();
        okButton.render();
    }
    protected abstract Button createButton();
}

Abstract Factory

Agrupa diversas fábricas relacionadas em uma única interface.

  • Intenção: Fornecer uma interface para criar famílias de objetos relacionados sem especificar suas classes concretas.
  • Use quando: Precisa garantir consistência na criação de objetos em diferentes variações (ex: temas de interface).
Diagrama UML do Abstract Factory
interface GUIFactory {
    Button createButton();
    Checkbox createCheckbox();
}

Builder

Separa a construção de um objeto complexo da sua representação.

  • Intenção: Construir objetos passo a passo, com o mesmo processo mas diferentes representações.
  • Use quando: O objeto tem muitos parâmetros ou etapas de montagem.
Diagrama UML do Builder
class CarBuilder {
    CarBuilder setSeats(int count);
    CarBuilder setEngine(Engine engine);
    Car build();
}

Prototype

Clona objetos existentes em vez de criar novos do zero.

  • Intenção: Usar uma instância prototípica como base para novas cópias.
  • Use quando: A criação é cara ou a configuração do objeto é complexa.
Diagrama UML do Prototype
abstract class Shape {
    public Shape clone() {
        return (Shape) this.clone();
    }
}

Singleton

Garante que apenas uma instância da classe exista e fornece acesso global a ela.

  • Intenção: Controlar a instanciação e garantir que só exista um objeto da classe.
  • Use com cuidado: Pode introduzir estado global e dificultar testes.
Diagrama UML do Singleton
class Config {
    private static Config instance;
    private Config() {}

    public static Config getInstance() {
        if (instance == null) {
            instance = new Config();
        }
        return instance;
    }
}

Tabela Comparativa

PadrãoResponsabilidadeMelhor Uso
Factory MethodDelegar criação às subclassesFrameworks, sistemas de plugins
Abstract FactoryCriar famílias de produtosTemas de UI, conectores de banco
BuilderConstrução passo a passoConfigurações complexas, APIs fluentes
PrototypeClonar instâncias existentesOtimização, árvores de objetos
SingletonGarantir uma instância únicaLogs, configurações, cache

Considerações Finais

Os padrões de criação moldam o ponto de partida de qualquer objeto no sistema. Eles parecem simples, mas influenciam diretamente a flexibilidade, testabilidade e reutilização da arquitetura.

No próximo post, vamos explorar os Padrões Estruturais — como compor objetos em estruturas maiores com clareza.