Introduzione
I pattern di progettazione sono molto popolari tra gli sviluppatori di software. Un pattern di progettazione è una soluzione ben descritta per un problema comune nel software.
Alcuni dei vantaggi nell’utilizzo dei pattern di progettazione sono:
- I pattern di progettazione sono già definiti e forniscono un approccio standard del settore per risolvere un problema ricorrente, quindi risparmia tempo se usiamo sensatamente il pattern di progettazione. Ci sono molti pattern di progettazione Java che possiamo utilizzare nei nostri progetti basati su Java.
- L’utilizzo dei pattern di progettazione promuove la riutilizzabilità che porta a un codice più robusto e altamente manutenibile. Aiuta a ridurre il costo totale di proprietà (TCO) del prodotto software.
- Dato che i pattern di progettazione sono già definiti, rendono il nostro codice facile da capire e debuggare. Porta a uno sviluppo più veloce e i nuovi membri del team lo comprendono facilmente.
I pattern di progettazione Java sono divisi in tre categorie – creazionali, strutturali, e comportamentali.
Questo articolo serve come indice per tutti gli articoli sui pattern di progettazione Java.
Pattern di Progettazione Creazionali
Creational design patterns forniscono soluzioni per istanziare un Object
nel modo migliore possibile per situazioni specifiche.
1. Singleton Pattern
Il pattern singleton limita l’istanziazione di una Class
e garantisce che esista solo un’istanza della classe nella Java Virtual Machine. L’implementazione del pattern singleton è sempre stata un argomento controverso tra gli sviluppatori.
Nota: Per saperne di più sul Singleton Design Pattern.
2. Factory Pattern
Il pattern di design factory viene utilizzato quando abbiamo una superclasse con diverse sottoclassi e, in base all’input, dobbiamo restituire una delle sottoclassi. Questo pattern toglie la responsabilità dell’istanziazione di una Class
dal programma client alla classe factory. Possiamo applicare un pattern singleton alla classe factory o rendere il metodo della factory static
.
Nota: Per saperne di più sul Factory Design Pattern.
3. Modello di Fabbrica Astratta
Il modello di fabbrica astratta è simile al modello di fabbrica ed è una fabbrica di fabbriche. Se sei familiare con il modello di progettazione della fabbrica in Java, noterai che abbiamo una singola classe di fabbrica che restituisce le diverse sottoclassi in base all’input fornito, e la classe di fabbrica utilizza dichiarazioni if-else
o switch
per realizzare questo. Nel modello di fabbrica astratta, eliminiamo il blocco if-else
e abbiamo una classe di fabbrica per ogni sottoclasse e quindi una classe di fabbrica astratta che restituirà la sottoclasse in base alla classe di fabbrica di input.
Nota: Scopri di più sul Modello di Fabbrica Astratta.
4. Modello Builder
Il modello builder è stato introdotto per risolvere alcuni problemi con i modelli di progettazione della fabbrica e della fabbrica astratta quando l’oggetto contiene molti attributi. Questo modello risolve il problema con un gran numero di parametri opzionali e uno stato inconsistente fornendo un modo per costruire l’oggetto passo dopo passo e fornire un metodo che restituirà effettivamente l’oggetto finale Object
.
Nota: Scopri di più sul Pattern Builder.
5. Pattern Prototype
Il pattern prototype viene utilizzato quando la creazione dell’Oggetto
è costosa e richiede molto tempo e risorse, e hai già un Oggetto
simile esistente. Quindi questo pattern fornisce un meccanismo per copiare l’Oggetto
originale in un nuovo Oggetto
e quindi modificarlo secondo le nostre esigenze. Questo pattern utilizza il clonaggio Java per copiare l’Oggetto
. Il pattern di progettazione del prototipo impone che l’Oggetto
che si sta copiando fornisca la funzione di copia. Non dovrebbe essere fatto da nessun’altra classe. Tuttavia, se utilizzare la copia superficiale o profonda delle proprietà dell’oggetto dipende dai requisiti ed è una decisione di progettazione.
Nota: Scopri di più sul Pattern Prototype.
Pattern di Progettazione Strutturale
I patterni di progettazione strutturale forniscono modi differenti per creare una struttura di Classe
(ad esempio, utilizzando l’ereditarietà e la composizione per creare un grande Oggetto
da piccoli Oggetti
).
1. Pattern Adapter
Il pattern di progettazione dell’adattatore è uno dei pattern di progettazione strutturali e viene utilizzato affinché due interfacce non correlate possano lavorare insieme. L’oggetto che unisce queste interfacce non correlate è chiamato un adattatore.
Nota: Per saperne di più sul Pattern Adapter.
2. Pattern Composite
Il pattern composito è utilizzato quando dobbiamo rappresentare una gerarchia parte-tutto. Quando dobbiamo creare una struttura in modo che gli oggetti nella struttura debbano essere trattati allo stesso modo, possiamo applicare il pattern di progettazione composito.
Nota: Per saperne di più sul Pattern Composite.
3. Pattern Proxy
Il pattern proxy fornisce un segnaposto per un altro Object
per controllare l’accesso ad esso. Questo pattern viene utilizzato quando vogliamo fornire un accesso controllato alla funzionalità.
Nota: Per saperne di più sul Pattern Proxy.
4. Pattern Flyweight
Il pattern di design flyweight viene utilizzato quando abbiamo bisogno di creare molti Object
di una Class
. Poiché ogni Object
consuma spazio di memoria che può essere cruciale per dispositivi a bassa memoria (come dispositivi mobili o sistemi embedded), il pattern di design flyweight può essere applicato per ridurre il carico sulla memoria condividendo gli Object
.
L’implementazione del pool di stringhe in Java è uno dei migliori esempi di implementazione del pattern flyweight.
Nota: Per saperne di più sul Pattern Flyweight.
5. Pattern Facade
Il pattern facade viene utilizzato per aiutare le applicazioni client a interagire facilmente con il sistema.
Nota: Scopri di più sul Pattern Facade.
6. Pattern Bridge
Quando abbiamo gerarchie di interfaccia sia nelle interfacce che nelle implementazioni, allora viene utilizzato il pattern di progettazione bridge per disaccoppiare le interfacce dall’implementazione e nascondere i dettagli dell’implementazione dai programmi client. L’implementazione del pattern di progettazione bridge segue il concetto di preferire la composizione rispetto all’ereditarietà.
Nota: Scopri di più sul Pattern Bridge.
7. Pattern Decorator
Il pattern design del decoratore viene utilizzato per modificare la funzionalità di un oggetto durante l’esecuzione. Allo stesso tempo, altre istanze della stessa classe non saranno influenzate da ciò, quindi l’oggetto individuale ottiene il comportamento modificato. Il pattern design del decoratore è uno dei pattern di progettazione strutturali (come il pattern adapter, il pattern bridge o il pattern composito) e utilizza classi astratte o interfacce con la composizione per implementare. Utilizziamo l’ereditarietà o la composizione per estendere il comportamento di un oggetto, ma ciò avviene durante la compilazione ed è applicabile a tutte le istanze della classe. Non possiamo aggiungere alcuna nuova funzionalità per rimuovere alcun comportamento esistente durante l’esecuzione: è qui che il pattern del decoratore risulta utile.
Nota: Scopri di più sul Pattern Decoratore.
Pattern di Progettazione Comportamentali
I pattern comportamentali forniscono una soluzione per una migliore interazione tra gli oggetti e come fornire accoppiamento debole e flessibilità per estendere facilmente.
1. Pattern Metodo Template
Il pattern del metodo template è un pattern di progettazione comportamentale e viene utilizzato per creare uno scheletro di metodo e per differire alcune delle fasi di implementazione alle sottoclassi. Il metodo template definisce le fasi per eseguire un algoritmo e può fornire un’implementazione predefinita che potrebbe essere comune per tutte o alcune delle sottoclassi.
Nota: Per saperne di più sul Pattern del Metodo Template.
2. Pattern Mediator
Il pattern di progettazione Mediator viene utilizzato per fornire un mezzo di comunicazione centralizzato tra diversi oggetti in un sistema. Se gli oggetti interagiscono direttamente tra loro, i componenti del sistema sono strettamente accoppiati tra loro, il che rende più elevato il costo di manutenzione e non flessibile per l’estensione. Il pattern Mediator si concentra nel fornire un mediatore tra gli oggetti per la comunicazione e nell’implementare un accoppiamento lasco tra gli oggetti. Il mediatore funziona come un router tra gli oggetti e può avere una propria logica per fornire un modo di comunicazione.
Nota: Per saperne di più sul Pattern Mediator
3. Pattern della Catena di Responsabilità
Il pattern della catena di responsabilità viene utilizzato per ottenere un accoppiamento leggero nel design del software, dove una richiesta dal cliente viene passata a una catena di oggetti per elaborarla. Quindi l’oggetto nella catena deciderà chi elaborerà la richiesta e se la richiesta deve essere inviata al prossimo oggetto nella catena o meno.
Sappiamo che possiamo avere più blocchi catch
in un blocco di codice try-catch
. Qui ogni blocco catch
è una specie di processore per elaborare quella particolare eccezione. Quindi quando si verifica un’eccezione nel blocco try
, viene inviata al primo blocco catch
per essere elaborata. Se il blocco catch
non è in grado di elaborarla, inoltra la richiesta al prossimo Object
nella catena (ossia, al blocco catch
successivo). Se anche l’ultimo blocco catch
non è in grado di elaborarla, l’eccezione viene lanciata al di fuori della catena al programma chiamante.
Nota: Per saperne di più sul Pattern della Catena di Responsabilità.
4. Pattern dell’Osservatore
Un pattern di progettazione osservatore è utile quando si è interessati allo stato di un Object
e si desidera essere notificati ogni volta che c’è un cambiamento. Nel pattern osservatore, l’Object
che osserva lo stato di un altro Object
è chiamato osservatore, e l’Object
che viene osservato è chiamato soggetto.
Java fornisce una piattaforma integrata per implementare il pattern osservatore attraverso la classe java.util.Observable
e l’interfaccia java.util.Observer
. Tuttavia, non è ampiamente utilizzato perché l’implementazione è limitata e nella maggior parte dei casi non vogliamo finire per estendere una classe solo per implementare il pattern osservatore poiché Java non fornisce l’ereditarietà multipla nelle classi. Il servizio di messaggistica Java (JMS) utilizza il pattern osservatore insieme al pattern mediatore per consentire alle applicazioni di sottoscriversi e pubblicare dati ad altre applicazioni.
Nota: Scopri di più sul Pattern Osservatore.
5. Pattern Strategia
Il pattern strategia viene utilizzato quando abbiamo più algoritmi per una specifica attività, e il cliente decide l’implementazione effettiva da utilizzare a tempo di esecuzione. Un pattern strategia è anche conosciuto come un pattern di politica. Definiamo più algoritmi e permettiamo alle applicazioni client di passare l’algoritmo da utilizzare come parametro.
Uno dei migliori esempi di questo pattern è il metodo Collections.sort()
che prende il parametro Comparator. In base alle diverse implementazioni delle interfacce del comparatore, gli oggetti vengono ordinati in modi diversi.
Nota: Scopri di più sul Pattern Strategia.
6. Pattern Command
Il pattern command viene utilizzato per implementare il disaccoppiamento in un modello di richiesta-risposta. In questo pattern, la richiesta viene inviata all’invoker e l’invoker la passa all’oggetto command incapsulato. L’oggetto command passa la richiesta al metodo appropriato del receiver per eseguire l’azione specifica.
Nota: Scopri di più sul Pattern Command.
7. Pattern State
Il pattern di progettazione dello stato viene utilizzato quando un oggetto cambia comportamento in base al suo stato interno. Se dobbiamo cambiare il comportamento di un oggetto in base al suo stato, possiamo avere una variabile di stato nell’oggetto e utilizzare un blocco di condizioni if-else per eseguire diverse azioni in base allo stato. Il pattern di stato viene utilizzato per fornire un modo sistematico e poco accoppiato per raggiungere questo scopo attraverso implementazioni di contesto e stato.
Nota: Scopri di più sul pattern di Stato.
8. Pattern Visitatore
Il pattern visitatore viene utilizzato quando dobbiamo eseguire un’operazione su un gruppo di oggetti simili. Con l’aiuto del pattern visitatore, possiamo spostare la logica operativa dagli oggetti a un’altra classe.
Nota: Scopri di più sul pattern del Visitatore.
9. Pattern Interpretatore
Il pattern interpretatore viene utilizzato per definire una rappresentazione grammaticale di un linguaggio e fornisce un interprete per gestire questa grammatica.
10. Pattern dell’Iteratore
Il pattern dell’iteratore è uno dei pattern comportamentali e viene utilizzato per fornire un modo standard di attraversare un gruppo di oggetti. Il pattern dell’iteratore è ampiamente utilizzato nel Framework di Collezioni Java dove l’interfaccia dell’iteratore fornisce metodi per attraversare una Collection
. Questo pattern viene anche utilizzato per fornire diversi tipi di iteratori in base alle nostre esigenze. Il pattern dell’iteratore nasconde l’implementazione effettiva del attraversamento della Collection
e i programmi client utilizzano i metodi dell’iteratore.
Nota: Per saperne di più sul Pattern dell’Iteratore.
11. Pattern del Memento
Il pattern del memento viene utilizzato quando vogliamo salvare lo stato di un oggetto in modo da poterlo ripristinare in seguito. Questo pattern viene utilizzato per implementare ciò in modo tale che i dati dello stato salvato dell’oggetto non siano accessibili all’esterno dell’Oggetto
, ciò protegge l’integrità dei dati dello stato salvato.
Il modello Memento è implementato con due Object
– originator e caretaker. L’originator è l’Object
il cui stato deve essere salvato e ripristinato, e utilizza una classe interna per salvare lo stato dell’Object
. La classe interna è chiamata “Memento” ed è private
in modo che non possa essere accessibile da altri oggetti.
Miscellaneous Design Patterns
Esistono molti design pattern che non rientrano nei design pattern del Gang of Four. Vediamo alcuni di questi design pattern popolari.
1. Design Pattern DAO
Il design pattern dell’oggetto di accesso ai dati (DAO) viene utilizzato per scollegare la logica di persistenza dei dati in un livello separato. DAO è un design pattern molto popolare quando progettiamo sistemi per lavorare con database. L’idea è mantenere separato il livello di servizio dal livello di accesso ai dati. In questo modo implementiamo la separazione della logica nella nostra applicazione.
Nota: Scopri di più sul Design Pattern DAO.
2. Pattern di Iniezione delle Dipendenze
Il pattern di iniezione delle dipendenze ci permette di rimuovere le dipendenze hard-coded e rendere la nostra applicazione poco accoppiata, estensibile e manutenibile. Possiamo implementare l’iniezione delle dipendenze in Java per spostare la risoluzione delle dipendenze dall’ora di compilazione all’ora di esecuzione. Il framework Spring è costruito sul principio dell’iniezione delle dipendenze.
Nota: Per saperne di più sul Pattern di Iniezione delle Dipendenze.
3. Pattern MVC
Il Pattern Model-View-Controller (MVC) è uno dei più vecchi pattern architetturali per la creazione di applicazioni web.
Conclusione
Questo articolo riassume i pattern di progettazione Java.
Puoi controllare il codice di esempio dei pattern di progettazione Java dal nostro Repository su GitHub.
Continua il tuo apprendimento con ulteriori tutorial di Java.
Source:
https://www.digitalocean.com/community/tutorials/java-design-patterns-example-tutorial