Padrões que todo dev sênior precisa conhecer Design Patterns em TypeScript
Guia completo dos principais design patterns com implementações práticas em TypeScript
Por que Design Patterns?
Soluções testadas
Padrões validados por milhares de desenvolvedores ao longo de décadas.
Comunicação eficaz
Linguagem comum entre desenvolvedores para discutir arquitetura.
Código mais robusto
Estruturas que facilitam manutenção e evolução do software.
Desenvolvimento mais rápido
Reutilização de soluções conhecidas acelera o desenvolvimento.
Padrões Criacionais Como criar objetos
Padrões que lidam com mecanismos de criação de objetos
Singleton
Garante que uma classe tenha apenas uma instância e fornece acesso global a ela.
Factory Method
Cria objetos sem especificar suas classes exatas, delegando para subclasses.
Builder
Constrói objetos complexos passo a passo, permitindo diferentes representações.
Padrões Estruturais Como organizar objetos
Padrões que lidam com composição de classes e objetos
Adapter
Permite que interfaces incompatíveis trabalhem juntas.
Decorator
Adiciona comportamentos a objetos dinamicamente sem alterar sua estrutura.
Facade
Fornece interface simplificada para um subsistema complexo.
Padrões Comportamentais Como objetos interagem
Padrões que focam na comunicação entre objetos e distribuição de responsabilidades
Observer
Define dependência um-para-muitos entre objetos para notificação automática.
Strategy
Define família de algoritmos e os torna intercambiáveis.
Command
Encapsula requisições como objetos, permitindo parametrização e filas.
Implementação Prática
Veja como implementar os padrões mais importantes em TypeScript
Singleton Pattern
class DatabaseConnection {
private static instance: DatabaseConnection;
private constructor() {}
static getInstance(): DatabaseConnection {
if (!DatabaseConnection.instance) {
DatabaseConnection.instance = new DatabaseConnection();
}
return DatabaseConnection.instance;
}
connect(): void {
console.log('Conectando ao banco...');
}
}
// Uso
const db1 = DatabaseConnection.getInstance();
const db2 = DatabaseConnection.getInstance();
console.log(db1 === db2); // truePerfeito para conexões de banco, loggers, caches e configurações globais.
Observer Pattern
interface Observer {
update(data: any): void;
}
class Subject {
private observers: Observer[] = [];
subscribe(observer: Observer): void {
this.observers.push(observer);
}
notify(data: any): void {
this.observers.forEach(observer => observer.update(data));
}
}
class EmailNotifier implements Observer {
update(data: any): void {
console.log('Email enviado:', data);
}
}
// Uso
const subject = new Subject();
const emailNotifier = new EmailNotifier();
subject.subscribe(emailNotifier);
subject.notify('Novo usuário cadastrado');Ideal para sistemas de notificação, eventos e atualizações em tempo real.