Solitamente ci viene sempre ricordato come sia importante in un'applicazione dividere nettamente la parte relativa all'interfaccia grafica (Presentation Layer) dalla parte relativa all'accesso ai dati (Data Layer). Questo è sicuramente utile perchè offre la possibilità di scrivere del codice che sia indipendente dalle tecniche di accesso ai dati. Quello che solitamente si fa in questi casi è frapporre un ulteriore livello (Business Layer) il quale si preoccuperà di astrarre completamente i meccanismi di accesso ai dati, fornendo al presentation layer una interfaccia che rimarrà tale anche se dovesse cambiare il meccanismo di accesso ai dati. Vediamo un semplice esempio in figura:
La classe Form1 istanzia un oggetto di tipo BIZ che contiene la logica di recupero delle informazioni che però devono essere restituite in formato di 'ogetto' Employee. L'istanza di BIZ a sua volta crea un oggetto Data Layer che restituisce un dataReader. Con quest'ultimo l'istanza biz scorrerà il dr per poter costruire un'istanza di tipo Employee. A questo punto non rimane che restituire tale istanza al Presentation Layer. Come si vede dalla figura, nel momento in cui cambiasse modalità di accesso al DB, lo strato di business riuscirebbe a nascondere questo cambiamento, continuando a restituire sempre lo stesso oggetto di tipo Employee.
Esistono comunque dei casi in cui, per motivi di spazio e di performance, è utile utilizzare solo i due livelli di Presentation e Data Layer. E' il caso di alcune applicazioni Mobile. Supponiamo però di avere un'applicazione mobile che utilizza diverse finestre Windows Form. Se ognuna di queste Form dovesse accedere al DB dovrebbe inevitabilmente istanziarsi una classe data layer, come in figura:
A questo punto ecco che ci viene utile il Singleton. Invece di permettere ad ogni Form di istanziare il proprio oggetto business, facciamo in modo tale che ciascun oggetto FORM possa utilizzare l'unica istanza di tipo Data, presente nella nostra applcazione. Un Singleton appunto: una classe che permette la creazione di una sola singola istanza:
Qualcuno potrebbe domandarsi perchè non costruire a questo punto una classe statica. Il motivo è che in una classe statica devo necessariamente utilizzare metodi statici e proprietà statiche. Questo limiterebbe la nostra istanza in uno schema estremamaente rigido che non ci servirebbe alla fine più di tanto. Come si fa a costruire una classe singleton? Innanzitutto è necessario fornire un costruttore non pubblico che verrà chiamato all'interno della classe stessa SOLO 1 VOLTA allorchè un oggetto FORM richiederà per la prima volta un'istanza del Singleton.
Dentro la classe Singleton poi inseriremo dei metodi per poter accedere al DB. Tali metodi ovviamente offriranno meno flessibilità rispetto alla presenza di una classe Business, ma daranno una maggiore performance sia dal punto di vista di occupazione di memoria, sia dal punto di vista della veloctà di accesso al DB. Vediamo in figura come nella dichiarazione della classe ci sono varie proprietà relative al DB da utilizzare. Una in particolare però è la proprieta di tipo ContosoDB che viene dichiarata static proprio perchè sarà l'unica istanza dell'applicazione.
Scorrendo poi il codice troviamo il costruttore. Come si riesce a capire dal sorgente, il costruttore inizializza le variabili precedenti tranne la proprietà ContosoDB. Il fulcro poi è rappresentato dal metodo GetInstance nel quale ci si chiede se la precedente proprietà è null. Se si allora è la prima volta che qualcuno chiede una istanza del singleton e invochiamo il costruttore, altrimenti non è la prima volta che viene chiesta l'istanza e restituiamo quindi l'oggetto già creato.
A questo punto siamo in grado di utilizzare la nostra classe singleton all'interno di tutte le finestre Form della nostra applicazione prendendo un'istanza tramite il metodo GetInstance e poi invocare i relativi metodi quali per esempio GetAllItems() dentro il quale si accede al DB tramite i metodi delle classi SQL. Vediamo infine come è possibile sfruttare la classe Singleton dalla Windows Form:
In conclusione, il pattern Singleton è un'ottima soluzione nelle applicazione Windpws Mobile in cui più soggetti sono interessati ad accedere al DB tramite una classe del livello Data. Ciò farà sicuramente risparmiare memoria e aumentare le performance di accesso.
sv.