#include <TFactory.h>
Diagramma di collaborazione per TFactory< T >:

In sostanza, si parla di realizzare un sistema per la gestione di quelli che, in gergo, si chiamano Plug-In: mini-programmi che si aggiungono ad altri piu' grandi per aumentarne le funzionalita'.
E' una "Factory" di Classi Plug-In.
Carica da libreria SO la definizione di una Classe che ha come Classe di Base il Parametro passato alla Factory: in questo modo e' sufficiente, per realizzare classi Plug-In, che le Classi da Istanziare a Run-Time implementino un'interfaccia comune.
Per la precisione, e' anche necessario che nella libreria SO che contiene la classe sia presente una funzione cosė definita:
extern "C"
*buildObject(void) { return new ; }
buildObject(void) crea effettivamente una istanza della Classe Plug-In.
Questa soluzione permette quindi di caricare nuove Classi senza bisogno ne di ricompilare, ne di modificare il codice.
Definizione alla linea 40 del file TFactory.h.
Membri pubblici | |
| TFactory (const string &) | |
| Costruttore TFactory. | |
| ~TFactory () | |
| Distruttore TFactory. | |
| T | build () |
| Restituisce una istanza della Classe contenuta nella SO. | |
| void | closeSo () |
| Chiude la libreria SO. | |
Membri privati | |
| void | openSo (const string &) |
| Carica la libreria SO. | |
Attributi privati | |
| void * | handler |
| T(* | builder )(void) |
|
||||||||||
|
Costruttore TFactory.
Si occupa anche di recuperare i Simboli (
Definizione alla linea 64 del file TFactory.h. Riferimenti TFactory< T >::builder, TFactory< T >::handler, e TFactory< T >::openSo().
00064 {
00065 try {
00066 /* Caricamento della SO */
00067 openSo(soLibPath);
00068 /* Casting necessario per una corretta assegnazione
00069 * della funzione al relativo puntatore */
00070 *(void **) (&builder) = dlsym(handler, "buildObject");
00071 /* Controlla che il Simbolo Cercato ("buildObject") sia
00072 * stato trovato... */
00073 if ( builder == NULL ) { // Errore nel caricamento della funzione
00074 /* ...in caso negativo, lancia un TFactoryException */
00075 string exceptionMessage("<TFactory msg> ERROR: ");
00076 exceptionMessage += dlerror();
00077 throw TFactoryException(exceptionMessage);
00078 }
00079 }
00080 catch ( TFactoryException &e ) {
00081 throw e;
00082 }
00083 cout << "<TFactory msg> Plug-In Loaded. Library-Path: "<< soLibPath << endl;
00084 }
|
Questo č il grafo delle chiamate per questa funzione:

|
|||||||||
|
Distruttore TFactory.
Definizione alla linea 88 del file TFactory.h.
00088 {}
|
|
|||||||||
|
Restituisce una istanza della Classe contenuta nella SO. L'oggetto restituito e' UP-Castato alla Classe Base "T" (parametro del Template)
Definizione alla linea 96 del file TFactory.h. Referenziato da Server::loadPlugInGames().
00096 {
00097 return ( (*builder)() ); // Ritorna la nuova istanza di T
00098 }
|
|
|||||||||
|
Chiude la libreria SO.
Definizione alla linea 118 del file TFactory.h. Riferimenti TFactory< T >::handler.
|
|
||||||||||
|
Carica la libreria SO.
Definizione alla linea 105 del file TFactory.h. Riferimenti TFactory< T >::handler. Referenziato da TFactory< T >::TFactory().
00105 {
00106 /* Apertura della Libreria SO */
00107 handler = dlopen( soLibPath.data(), RTLD_NOW);
00108
00109 if (!handler) {
00110 string exceptionMessage("<TFactory msg> ERROR: ");
00111 exceptionMessage += dlerror();
00112 throw TFactoryException(exceptionMessage);
00113 }
00114 }
|
|
|||||
|
Referenziato da TFactory< T >::TFactory(). |
|
|||||
|
Definizione alla linea 49 del file TFactory.h. Referenziato da TFactory< T >::closeSo(), TFactory< T >::openSo(), e TFactory< T >::TFactory(). |
1.3.4