Docsity
Docsity

Prepara i tuoi esami
Prepara i tuoi esami

Studia grazie alle numerose risorse presenti su Docsity


Ottieni i punti per scaricare
Ottieni i punti per scaricare

Guadagna punti aiutando altri studenti oppure acquistali con un piano Premium


Guide e consigli
Guide e consigli


Design Pattern (ingegneria del software), Appunti di Programmazione Avanzata

Spiegazione con esempi e dettagli dei Design Pattern

Tipologia: Appunti

2016/2017

Caricato il 12/05/2017

luigi-piccolo
luigi-piccolo 🇮🇹

3 documenti

1 / 7

Toggle sidebar

Questa pagina non è visibile nell’anteprima

Non perderti parti importanti!

bg1
DEFINIZIONE GENERALE E TIPI DI PATTERNS
Il pattern si definisce come una soluzione architetturale che può risolvere problemi in contesti eterogenei.
C'è stato un gruppo di 4 persone, la cosiddetta GOF(Gang of Four) che ha creato 23 pattern in base a
differenti contesti e in base alla circostanza d'uso.
3 sono i tipi di Pattern fondamentali:
Creational Patterns-Pattern creazionali: propongono soluzioni per creare oggetti
Structural Patterns-Pattern strutturali: propongono soluzioni per la composizione strutturale di classi
e oggetti
Behavioral Patterns-Pattern comportamentali: propongono soluzioni per gestire il modo in cui
vengono suddivise le responsabilità delle classi e degli oggetti
DEFINIZIONE DETTAGLIATA CREATIONAL PATTERNS
I pattern creazionali nascondono i costruttori delle classi e mettono dei metodi al loro posto creando
un'interfaccia: in questo modo si possono utilizzare oggetti senza sapere come sono implementati
Nomi dei Creational Patterns:
-Singleton(singoletto):
Scopo: Assicura che una classe abbia una sola istanza e fornisce un punto globale di accesso ad essa
Motivazione: per alcune classi è importante avere una sola istanza
Applicabilità: deve esistere solo un’istanza della classe e deve essere accessibile
da un punto noto.
L’unica istanza deve essere estesa e i client devono essere capaci di usare
un’istanza estesa senza modicare il loro codice
-Factory Method(metodo fabbrica):--->detto anche Virtual Constructor
Scopo: Definire un’interfaccia per creare un oggetto ma lasciare la scelta del suo tipo alla sottoclasse
essendo la creazione differita a runtime
Motivazione: I Framework usano classi astratte per denire e mantenere le
relazioni tra oggetti. e.g., framework per applicazioni che presenta diversi
documenti all’utente.
e.g., in hotel, Stanza factory, Chiamata telefonica factory
Applicabilità: una classe non può anticipare la classe di oggetti che deve creare.
Una classe vuole che le sottoclassi specicano gli oggetti da creare. Le classi
delegano le responsabilità ad una delle
diverse sottoclassi “helper”
-Abstract factory(fabbrica astratta): ---->conosciuto anche come Kit
Scopo: Disporre di un’interfaccia per creare una famiglia di oggetti connessi o dipendenti senza
specificare le loro classi concrete
Motivazione: Modularizzazione, aggiungere codice a classi esistenti in modo da
incapsulare informazioni più generali. e.g., gestore telefonico, ogni numero è
identicato dall’area e dal
paese. Aggiungere numeri di altri paesi potrebbe essere complicato
Applicabilità: un sistema indipendente dalla creazione, composizione e rappresentazione dei suoi
prodotti. Un sistema configurato con molte famiglie di prodotti. Creare una libreria di prodotti e
vogliamo conoscere solo le loro interfacce e non l’implementazione
pf3
pf4
pf5

Anteprima parziale del testo

Scarica Design Pattern (ingegneria del software) e più Appunti in PDF di Programmazione Avanzata solo su Docsity!

DEFINIZIONE GENERALE E TIPI DI PATTERNS

Il pattern si definisce come una soluzione architetturale che può risolvere problemi in contesti eterogenei. C'è stato un gruppo di 4 persone, la cosiddetta GOF (Gang of Four) che ha creato 23 pattern in base a differenti contesti e in base alla circostanza d'uso. 3 sono i tipi di Pattern fondamentali:

  • Creational Patterns-Pattern creazionali: propongono soluzioni per creare oggetti
  • Structural Patterns-Pattern strutturali: propongono soluzioni per la composizione strutturale di classi e oggetti
  • Behavioral Patterns-Pattern comportamentali: propongono soluzioni per gestire il modo in cui vengono suddivise le responsabilità delle classi e degli oggetti

DEFINIZIONE DETTAGLIATA CREATIONAL PATTERNS I pattern creazionali nascondono i costruttori delle classi e mettono dei metodi al loro posto creando un'interfaccia: in questo modo si possono utilizzare oggetti senza sapere come sono implementati

Nomi dei Creational Patterns: -Singleton(singoletto):

  • Scopo: Assicura che una classe abbia una sola istanza e fornisce un punto globale di accesso ad essa
  • Motivazione: per alcune classi è importante avere una sola istanza
  • Applicabilità: deve esistere solo un’istanza della classe e deve essere accessibile da un punto noto. L’unica istanza deve essere estesa e i client devono essere capaci di usare un’istanza estesa senza modificare il loro codice

-Factory Method(metodo fabbrica):--->detto anche Virtual Constructor

  • Scopo: Definire un’interfaccia per creare un oggetto ma lasciare la scelta del suo tipo alla sottoclasse essendo la creazione differita a runtime
  • Motivazione: I Framework usano classi astratte per definire e mantenere le relazioni tra oggetti. e.g., framework per applicazioni che presenta diversi documenti all’utente. e.g., in hotel , Stanza factory, Chiamata telefonica factory
  • Applicabilità: una classe non può anticipare la classe di oggetti che deve creare. Una classe vuole che le sottoclassi specificano gli oggetti da creare. Le classi delegano le responsabilità ad una delle diverse sottoclassi “helper”

-Abstract factory(fabbrica astratta): ---->conosciuto anche come Kit

  • Scopo: Disporre di un’interfaccia per creare una famiglia di oggetti connessi o dipendenti senza specificare le loro classi concrete
  • Motivazione: Modularizzazione, aggiungere codice a classi esistenti in modo da incapsulare informazioni più generali. e.g., gestore telefonico , ogni numero è identificato dall’area e dal paese. Aggiungere numeri di altri paesi potrebbe essere complicato
  • Applicabilità: un sistema indipendente dalla creazione, composizione e rappresentazione dei suoi prodotti. Un sistema configurato con molte famiglie di prodotti. Creare una libreria di prodotti e vogliamo conoscere solo le loro interfacce e non l’implementazione

-Factory Pattern:

  • Scopo: Creare oggetti senza esporre la logica di instanziazione al client. Creazione di oggetti attraverso un’interfaccia comune.
  • Motivazione: E’ probabilmente il più usato pattern nei moderni linguaggi di programmazione, ad esempio JDK, Spring e Struts lo usano
  • Applicabilità: Ha differenti varianti e deriva dal Factory Method e Abstract Factory

-Builder(costruttore):

  • Scopo: Separare la costruzione di un oggetto complesso dalla sua rappresentazione in modo tale che lo stesso processo di costruzione può creare differenti rappresentazioni
  • Motivazione: Un’applicazione potrebbe avere bisogno di un meccanismo per la costruzione di oggetti complessi che è indipendente da quelli che compongono l’oggetto. Definisce un’istanza per creare un oggetto ma dando la possibilità alle sottoclassi di decidere quali classi istanziare. Riferimento ai nuovi oggetti creati attraverso un’interfaccia comune
  • Applicabilità: Un algoritmo per creare un oggetto complesso deve rendere indipendenti le parti per costruire l’oggetto e per il loro assemblaggio. Il processo di costruzione deve permettere differenti rappresentazioni per gli oggetti costruiti. Si può usare per: Casa automobilistica può costruire auto, biciclette, motociclette e scooter Builder diventa VehicleBuilder Applicazione per gli esami studenti lista e informazioni di esami differenti utenti di login (admin e user) Builder fornisce un’interfaccia che fornisce informazioni in base all’utente

-Prototype(prototipo):

  • Scopo: Specifica il tipo di oggetti da creare usando un’istanza prototipale e creando nuovi oggetti copiando questi oggetti
  • Motivazione: Permette ad un oggetto di creare oggetti senza conoscere la loro classe o i dettagli per crearli
  • Applicabilità: sistema indipendente da come i suoi prodotti sono creati, composti e rappresentati. Le classi da istanziare sono specificate a run-time per evitare di scrivere una gerarchia di classi. E’ più conveniente copiare un’istanza esistente che crearne una nuova. Si usa per: Game un labirinto con diversi oggetti visuali per generare diverse mappe del labirinto Muri, porte, passaggi, stanze, … diversi prototipi per i componenti Vendite analisi di dati da un database per ogni analisi sugli stessi dati possiamo clonare le informazioni estratte dal database

DEFINIZIONE DETTAGLIATA BEHAVIORAL PATTERNS

I Behavioral Patterns-Pattern comportamentali forniscono soluzione alle più comuni tipologie di interazione tra gli oggetti

Tipi di Behavioral Patterns: -Chain of Responsibility:

  • Motivazione: Un oggetto aggregato dovrebbe fornire un metodo per accedere agli elementi senza esporre la struttura interna
  • Applicabilità: accedere a contenuti di una collezione senza esporre la sua struttura interna. Supportare più scorrimenti simultanei di una collezione. Fornire un’interfaccia uniforme per lo scorrimento di collezioni differenti

-Mediator:

  • Scopo: Definire un oggetto che incapsula il meccanismo di interazione di oggetti, consentendo il loro disaccoppiamento in modo da variare facilmente le interazioni tra di loro.
  • Motivazione: permettere di modificare agilmente le politiche di interazione, poiché le entità coinvolte devono fare riferimento al loro interno solamente al mediatore
  • Applicabilità: Un insieme di oggetti comunicano in un modo ben definito ma complesso. Le interdipendenze non strutturate e difficili da capire. Il riuso di un oggetto è difficile perché si riferisce e relaziona molti altri oggetti. Un comportamento distribuito tra diverse classi dovrebbe essere customizzabile senza l’uso di molte sottoclassi. Per esempio si può usare per costruire una chat

-Memento:

  • Scopo: L’intento di questo modello è di catturare lo stato interno di un oggetto senza violare incapsulamento e fornendo così un mezzo per ripristinare l’oggetto allo stato iniziale quando necessario.
  • Motivazione: A volte si rende necessaria l’acquisizione dello stato interno di un oggetto in un certo istante e ripristinare successivamente l’oggetto a quello stato. Il processo è utile in caso di errori, e.g., calcolatrice che mantiene la lista delle operazioni precedenti
  • Applicabilità: viene utilizzato quando uno stato di un oggetto deve essere catturato in modo che possa essere ripristinato a quello stato più tardi. In situazioni in cui il passaggio in modo esplicito dello stato dell’oggetto violerebbe incapsulamento. Si può anche usare per gestione file

-Observer: ---->conosciuto come Publish-Subscribe

  • Scopo: Definisce una dipendenza una a molti tra oggetti, tale che se un oggetto cambia stato, tutte le sue dipendenze sono notificate e aggiornate automaticamente
  • Motivazione: Un effetto del partizionamento di un sistema in una collezione di classi cooperanti è la necessità di mantenere le consistenze tra gli oggetti. Le classi non devono essere fortemente accoppiate perché riducono la loro riusabilità
  • Applicabilità: quando un’astrazione ha due aspetti che dipendono l’uno dall’altro. L’incapsulamento di questi aspetti in oggetti separati permette il loro riuso in modo indipendente. Quando il cambiamento di un oggetto richiede il cambiamento di altri e non si conoscono quanti oggetti hanno bisogno di essere cambiati. Si può usare nell’ambito comunicazione numeri

-State:---->conosciuto anche come Objects for States

  • Scopo: Permette ad uno oggetto di cambiare il proprio comportamento quando cambia il suo stato interno. L’oggetto sembrerà cambiare la sua classe.
  • Motivazione: soluzione al problema di come rendere il comportamento dipendente dallo stato. Consente ad un oggetto di cambiare il proprio comportamento a run-time in funzione dello stato in cui si trova
  • Applicabilità: il comportamento associato ad uno stato dipende solo da una classe. La logica che implementa il cambiamento di stato viene implementata in una sola classe piuttosto che con istruzioni condizionali nella classe che implementa il comportamento. Evita stati incoerenti

-Strategy: ---->conosciuto anche come Policy

  • Scopo: Definire una famiglia di algoritmi, incapsularli e renderli intercambiabili. L’algoritmo cambia indipendentemente dai client che lo usano.
  • Motivazione: necessità di modificare dinamicamente gli algoritmi utilizzati da un’applicazione. e.g., visite in una struttura ad albero , possibilità di selezionare a tempo di esecuzione una tra le visite
  • Applicabilità: classi correlate differiscono solo per il loro comportamento. Abbiamo bisogno di varianti di un algoritmo. Un algoritmo usa dati che i client non dovrebbero conoscere.

Una classe definisce diversi comportamenti

-Template Method:

  • Scopo: Definire lo scheletro di un algoritmo in un’operazione, rinviando alcuni passi alle sottoclassi client. Consente alle sottoclassi di ridefinire alcuni passi senza cambiare la struttura dell’algoritmo.
  • Motivazione: necessità di modificare dinamicamente gli algoritmi utilizzati da un’applicazione e.g., visite in una struttura ad albero , possibilità di selezionare a tempo di esecuzione una tra le visite
  • Applicabilità: quando si vuole implementare la parte invariante di un algoritmo una volta sola e lasciare che le sottoclassi implementino il comportamento che può variare. Quando il comportamento comune di più classi può essere fattorizzato in una classe a parte per evitare di scrivere più volte lo stesso codice. Per avere modo di controllare come le sottoclassi ereditano dalla superclasse, facendo in modo che i metodi template chiamino dei metodi “gancio” (hook) e impostarli come unici metodi sovrascrivibili

-Visitor:

  • Scopo: Rappresentare un’operazione da eseguire sugli elementi di una struttura oggetto. Permette di definire una nuova operazione senza cambiare le classi degli elementi su cui opera.
  • Motivazione: separare un algoritmo dalla struttura di oggetti composti a cui è applicato. Aggiungere nuove operazioni e comportamenti senza dover modificare la struttura stessa. In collezioni contenere oggetti di tipo diverso operazioni eseguite su tutti gli elementi di raccolta senza conoscere il tipo
  • Applicabilità: una struttura di oggetti è costituita da molte classi con interfacce diverse ed è necessario che l’algoritmo esegua su ogni oggetto un’operazione differente a seconda dalla classe concreta dell’oggetto stesso. E’ necessario eseguire svariate operazioni indipendenti e non relazionate tra loro sugli oggetti di una struttura composta, ma non si vuole sovraccaricare le interfacce delle loro classi. Riunendo le operazioni correlate in ogni Visitor è possibile inserirle nei programmi solo dove necessario. Le classi che costituiscono la struttura composta sono raramente suscettibili di modifica, ma è necessario aggiungere spesso operazioni sui rispettivi oggetti

DEFINIZIONE DETTAGLIATA STRUCTURAL PATTERNS

I Structural Patterns consentono di riutilizzare degli oggetti esistenti fornendo agli utilizzatori un’interfaccia più adatta alle loro esigenze

Esempi di Structural Patterns: -Adapter: --->conosciuto anche come Wrapper

  • Scopo: Converte l’interfaccia di una classe in un’altra richiesta dai client. Permette alle classi di collaborare sebbene esista un’incompatibilità di interfacce.
  • Motivazione: fornire una soluzione astratta al problema dell’interoperabilità tra interfacce differenti, e.g., in un software si devono utilizzare sistemi di supporto (come per esempio librerie ) la cui interfaccia non è perfettamente compatibile con quanto richiesto da applicazioni già esistenti
  • Applicabilità: utilizzo di una classe esistente che presenti un’interfaccia diversa da quella desiderata. Scrittura di una determinata classe senza poter conoscere a priori le altre classi con cui dovrà operare

-Bridge: ----->conosciuto anche come Handle/Body

  • Scopo: Separa un’astrazione dalla sua implementazione, in modo che entrambe possano variare indipendentemente.
  • Motivazione: Spesso un’astrazione deve avere diverse implementazioni: gestione di database relazionali o file system soluzione - ereditarietà l’ereditarietà lega un’implementazione all’astrazione
  • Applicabilità: necessità di evitare un collegamento permanente tra l’astrazione e l’implementazione. Quando l’astrazione e l’implementazione hanno bisogno di cambiare indipendentemente. Usando il

caricamento dell’oggetto in memoria al primo riferimento controllo che l’oggetto reale non sia accessibile