Princípios de Design Orientado a Objetos

Conceitos Fundamentais

  • Classes, objetos, referências, atributos, métodos
  • Interfaces, classes abstratas
  • Herança, composição
  • Visibilidade: privado, pacote, público

Programação Orientada a Objetos

  • Tudo é tratado como objeto
  • Programas são coleções de objetos que interagem via mensagens
  • Cada objeto possui estado (atributos) e comportamento (métodos)
  • Cada objeto pertence a um tipo específico
  • Objetos do mesmo tipo respondem às mesmas mensagens

Princípios Essenciais

  • Alta coesão, baixo acoplamento
  • Separação entre elementos mutáveis e imutáveis
  • Dependência de abstrrações, não implementações
  • Preferência por composição sobre herança
  • Princípio aberto/fechado

Exemplo Prático: Limitações do Operador New

class Aparelho {
    private Tela tela = new TelaLCD();
    
    void iniciar() {
        tela.exibir();
    }
}

interface Tela {
    void exibir();
}

class TelaLCD implements Tela {
    public void exibir() {
        System.out.println("Exibindo conteúdo...");
    }
}

Problemas:

  • Dependência direta entre classes
  • Dificuldade em alterar implementações
  • Criação obrigatória de novas instâncias

Solução: Fábrica Estática

class Aparelho {
    private Tela tela = FabricaTelas.criarTelaLCD();
    
    void iniciar() {
        tela.exibir();
    }
}

class FabricaTelas {
    public static Tela criarTelaLCD() {
        return new TelaLCD();
    }
}

Vantagens:

  • Isloamento de dependências
  • Nomes descritvios para criação
  • Possibilidade de reutilizar instâncias

Solução: Configuração por Variáveis de Ambiente

class FabricaTelas {
    public static Tela criarTela() {
        String nomeClasse = System.getProperty("tela.tipo");
        try {
            Class> classe = Class.forName(nomeClasse);
            return (Tela) classe.newInstance();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

Vantagem: Flexibilidade via configuração externa

Solução: Registro Global

class RegistroServicos {
    private static Map<string object=""> servicos = new HashMap<>();
    
    public static void registrar(String nome, Object servico) {
        servicos.put(nome, servico);
    }
    
    public static Object obter(String nome) {
        return servicos.get(nome);
    }
}

// Uso:
RegistroServicos.registrar("tela", new TelaLCD());
Tela tela = (Tela) RegistroServicos.obter("tela");</string>

Aplicações: Sistemas JEE, gestão centralizada de dependências

Tags: java POO Padrões de Projeto Injeção de Dependência Fábrica Abstrata

Publicado em 7-12 19:11