Sobes.tech
Middle

Quali pattern di progettazione, oltre Singleton, hai utilizzato?

sobes.tech AI

Risposta dell'AI

  • Metodo Factory. Utilizzato per creare oggetti senza specificare esplicitamente il tipo di classe. È utile quando la logica di creazione dell'oggetto dipende dalle sottoclassi.
  • Factory Astratta. Impiegato per creare famiglie di oggetti correlati o dipendenti, fornendo un'interfaccia per farlo, ma senza specificare classi concrete.
  • Builder. Usato per creare oggetti complessi passo dopo passo, dove l'ordine e la combinazione dei passaggi possono variare. Permette di evitare il "costruttore telescopico".
  • Observer. Implementato per creare dipendenze "uno a molti" tra oggetti, dove una modifica dello stato di un oggetto notifica automaticamente tutti gli oggetti dipendenti.
  • Strategy. Applicato per definire una famiglia di algoritmi, incapsularli e garantire la loro intercambiabilità. Permette di scegliere l'algoritmo durante l'esecuzione.
  • Decorator. Utilizzato per aggiungere dinamicamente nuove responsabilità agli oggetti senza modificarne la struttura.
  • Proxy. Impiegato quando è necessario controllare l'accesso a un oggetto, ad esempio, per caricamento pigro o accesso remoto.
  • Template Method. Usato per definire lo scheletro di un algoritmo nella superclasse, consentendo alle sottoclassi di ridefinire alcuni passaggi senza cambiare la struttura principale.
  • Adapter. Impiegato per trasformare l'interfaccia di una classe nell'interfaccia attesa dai clienti. Permette a classi con interfacce incompatibili di lavorare insieme.
  • Command. Utilizzato per incapsulare una richiesta come oggetto, consentendo di parametrizzare i clienti con richieste diverse, mettere le richieste in coda o tenere un registro delle operazioni, oltre a supportare l'annullamento.

Esempio di implementazione del Factory Method:

// Interfaccia del prodotto
interface Product {
    void doSomething();
}

// Prodotti concreti
class ConcreteProductA implements Product {
    @Override
    public void doSomething() {
        System.out.println("Fa qualcosa in Product A");
    }
}

class ConcreteProductB implements Product {
    @Override
    public void doSomething() {
        System.out.println("Fa qualcosa in Product B");
    }
}

// Interfaccia della fabbrica
abstract class Creator {
    public abstract Product factoryMethod();

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

// Fabbriche concrete
class ConcreteCreatorA extends Creator {
    @Override
    public Product factoryMethod() {
        return new ConcreteProductA();
    }
}

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