Sobes.tech
Middle

Que padrões de projeto, além do Singleton, você usou?

sobes.tech IA

Resposta da IA

  • Método de Fábrica. Utilizado para criar objetos sem especificar explicitamente o tipo de classe. É útil quando a lógica de criação do objeto depende das subclasses.
  • Fábrica Abstrata. Empregado para criar famílias de objetos relacionados ou dependentes, fornecendo uma interface para isso, mas sem especificar classes concretas.
  • Builder. Utilizado para criar objetos complexos passo a passo, onde a ordem e a combinação de passos podem variar. Permite evitar o "construtor telescópico".
  • Observer. Implementado para criar dependências "um para muitos" entre objetos, onde uma mudança no estado de um objeto notifica automaticamente todos os objetos dependentes.
  • Strategy. Aplicado para definir uma família de algoritmos, encapsular cada um deles e garantir sua intercambialidade. Permite selecionar o algoritmo em tempo de execução.
  • Decorator. Utilizado para adicionar dinamicamente novas responsabilidades aos objetos sem modificar sua estrutura.
  • Proxy. Empregado em casos onde é necessário controlar o acesso a um objeto, por exemplo, para carregamento preguiçoso ou acesso remoto.
  • Template Method. Utilizado para definir a estrutura do algoritmo na superclasse, permitindo que as subclasses redefinam certos passos do algoritmo sem alterar a estrutura principal.
  • Adapter. Aplicado para transformar a interface de uma classe na interface esperada pelos clientes. Permite que classes com interfaces incompatíveis trabalhem juntas.
  • Command. Utilizado para encapsular uma solicitação na forma de um objeto, permitindo parametrizar clientes com diferentes solicitações, colocar solicitações em fila ou manter um registro de operações, bem como suportar desfazer operações.

Exemplo de implementação do Factory Method:

// Interface do produto
interface Product {
    void doSomething();
}

// Produtos concretos
class ConcreteProductA implements Product {
    @Override
    public void doSomething() {
        System.out.println("Faz algo em Product A");
    }
}

class ConcreteProductB implements Product {
    @Override
    public void doSomething() {
        System.out.println("Faz algo em Product B");
    }
}

// Interface da fábrica
abstract class Creator {
    public abstract Product factoryMethod();

    public void someOperation() {
        Product product = factoryMethod();
        product.doSomething();
    }
}

// Fábricas concretas
class ConcreteCreatorA extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

class ConcreteCreatorB extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductB();
    }
}