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();
}
}