O padrão factory resolve o problema de acoplamento entre classes filhas que compartilham uma interface comum. Em vez de instanciar diretamente objetos filhos, um classe intermediária controla a criação.
Estrutura Básica
interface Veiculo {
void operar();
}
class Carro implements Veiculo {
public void operar() {
System.out.println("Carro em movimento");
}
}
class Moto implements Veiculo {
public void operar() {
System.out.println("Moto acelerando");
}
}
Classe de Fábrica
public class FabricaVeiculos {
public static Veiculo criarVeiculo(String tipo) {
switch(tipo) {
case "carro": return new Carro();
case "moto": return new Moto();
default: return null;
}
}
}
Uso do Padrão
public class Teste {
public static void main(String[] args) {
Veiculo v = FabricaVeiculos.criarVeiculo("moto");
v.operar();
}
}
Padrão Proxy
Implementa uma camada intemrediária para controlar o acesso a um objeto, adicionando funcionalidades como validação ou log antes e depois da execução real.
Exemplo de Uso
interface Servico {
void executar();
}
class ServicoReal implements Servico {
public void executar() {
System.out.println("Executando serviço real");
}
}
class ServicoProxy implements Servico {
private Servico real;
public ServicoProxy(Servico s) {
this.real = s;
}
public void executar() {
System.out.println("Validando acesso...");
real.executar();
System.out.println("Log de execução salvo");
}
}
public class TesteProxy {
public static void main(String[] args) {
Servico s = new ServicoProxy(new ServicoReal());
s.executar();
}
}
Padrão Adapter
Permite que interfaces incompatíveis trabalhem juntas através de uma classe adaptadora que converte chamadas entre os foramtos.
Implementação
interface Impressora {
void imprimir(String texto);
}
interface Digitalizador {
String digitalizar();
}
class ImpressoraAntiga implements Impressora {
public void imprimir(String texto) {
System.out.println("Imprimindo: " + texto);
}
}
class Adaptador implements Impressora, Digitalizador {
private ImpressoraAntiga impressora;
public Adaptador(ImpressoraAntiga i) {
this.impressora = i;
}
public void imprimir(String texto) {
impressora.imprimir(texto);
}
public String digitalizar() {
return "Texto digitalizado";
}
}
public class TesteAdapter {
public static void main(String[] args) {
ImpressoraAntiga antiga = new ImpressoraAntiga();
Adaptador adapter = new Adaptador(antiga);
adapter.imprimir("Documento");
System.out.println(adapter.digitalizar());
}
}