A26. Metodi factory
Si definisce metodo Factory un metodo che ha il solo compito di creare un oggetto e restituirlo al
chiamante. Un esempio di metodi factory possono essere la funzione Add di TreeView.Nodes, oppure l'omonima
Add di ogni collezione modificabile, come Items dei controlli ListBox e ComboBox (per informazioni su questi
controlli, vedere i primi capitoli nella sezione Windows Form). La particolarità di questi ultimi esempi
è che si riferiscono a metodi factory di istanza: la loro peculiarità è che creano oggetti dipendenti
dal tipo a cui appartengono. ListView.Nodes.Add crea degli oggetti ListViewItem.
Ci si potrebbe chiedere perchè usare metodi factory al posto di normali costruttori. La differenza tra questi non è da sottovalutare: i costruttori vengono eseguiti certo prima di ogni altra cosa, ma solo successivamente alla creazione dell'oggetto vero e proprio in memoria; i metodi factory, invece possono controllare la correttezza dei prametri passati e creare l'oggetto solo dopo essersi assicurati che la sua creazione andrà sicuramente a buon fine; inoltre questi ultimi possono anche lanciare eccezioni qualora i parametri passati fossero incorretti. Un esempio di quanto detto:
Ci si potrebbe chiedere perchè usare metodi factory al posto di normali costruttori. La differenza tra questi non è da sottovalutare: i costruttori vengono eseguiti certo prima di ogni altra cosa, ma solo successivamente alla creazione dell'oggetto vero e proprio in memoria; i metodi factory, invece possono controllare la correttezza dei prametri passati e creare l'oggetto solo dopo essersi assicurati che la sua creazione andrà sicuramente a buon fine; inoltre questi ultimi possono anche lanciare eccezioni qualora i parametri passati fossero incorretti. Un esempio di quanto detto:
Il codice sopra riportato crea volutamente tutte le situazioni contemplate all'interno del metodo factory statico: E ha gli stessi parametri di D, quindi nel metodo factory usato per creare E viene restituita l'istanza D già esistente; F ha lo stesso ID, quindi è Nothing. A prova di ciò, sullo schermo apparirà il seguente output:Module Module1Class Document 'Campo statico che contiene tutti i documenti 'aperi fin'ora Private Shared DocumentsAs New Hashtable 'Identificatore del documento Private ReadOnly _IDAs Int16 'Nome del file e testo contenuto in esso Private ReadOnly _FileName, _TextAs String Public ReadOnly Property ID()As Int16Get Return _IDEnd Get End Property Public ReadOnly Property FileName()As String Get Return _FileNameEnd Get End Property Public ReadOnly Property Text()As String Get Return _TextEnd Get End Property 'Da notare il costruttore Private: nessun client al di fuori 'della classe può inizializzare il nuovo oggetto. Solo il 'metodo factory lo può fare Private Sub New (ByVal IDAs Int16,ByVal PathAs String )Me ._ID = IDMe ._FileName = PathMe ._Text = IO.File.ReadAllText(Path) 'Me fa riferimento alla classe stessa Documents.Add(ID,Me )End Sub 'Il metodo factory crea un documento se non esiste l'ID 'e se il percorso su disco è diverso, altrimenti 'restituisce il documento che esiste già Public Shared Function Create(ByVal IDAs Int16, _ByVal PathAs String )As DocumentIf Documents.ContainsKey(ID)Then 'Ottiene il documento già esistente con questo ID Dim DAs Document = Documents(ID) 'Se coincidono sia l'ID che il nome del file, allora 'restituisce l'oggetto già esistente If D.FileName = PathThen Return DElse 'Altrimenti restituisce Nothing Return NothingEnd If End If 'Se non esiste un documento con questo ID, lo crea Return New Document(ID, Path)End Function End Class Sub Main()Dim DAs Document = Document.Create(0, "C:\testo.txt")Dim EAs Document = Document.Create(0, "C:\testo.txt")Dim FAs Document = Document.Create(0, "C:\file.txt")Dim GAs Document = Document.Create(1, "C:\file.txt") 'Dimostra che se ID e Path coincidono, i due oggetti 'sono la stessa istanza Console.WriteLine(EIs D) 'Dimostra che se l'ID esiste già, ma il Path differisce, 'l'oggetto restituito è Nothing Console.WriteLine(FIs Nothing ) Console.ReadKey()End Sub End Module
True True
Classi factory e oggetti immutabili
Una classe contenente solo metodi factory è detta classe factory. Il più delle volte, l'uso di una tattica
simile a quella sopra riportata potrebbe portare alcuni dubbi: dato che esistono due variabili che puntano
alla stessa istanza, il modificarne l'una potrebbe causare l'automatica modifica dell'altra. Tuttavia, spesse
volte, gli oggetti che possono essere creati con metodi factory non espongono alcun altro metodo per la modifica
o l'eliminazione dello stesso oggetto, che quindi non può essere cambiato in alcun modo. Oggetti di questo tipo
sono detti immutabili: un esempio di oggetti immutabili sono la stringhe. Al contrario di come si
potrebe pensare, una volta create il loro valore non può essere cambiato: l'unica cosa che si può fare
è assegnare alla variabile stringa un nuovo valore:
'Questa stringa è immutabile Dim SAs String = "Ciao" 'Viene creata una nuova stringa temporanea con valore "Buongiorno" 'e assegnata a S. "Ciao" verrà distrutta dal Garbage Colletcion S = "Buongiorno"
The Totem's Lair - Copyright (C) 2009
È vietata la riproduzione sia totale che parziale del sito.



