La classe BatchManagerCatalog definit une interface d'acces au catalogue de fabriques de BatchManager. See Classe FactBatchManager.
Pourquoi utiliser une fabrique et ne pas instancier directement un objet BatchManager en fonction de sa classe ? C'est l'option qui avait ete choisie dans la premiere version de la bibliotheque de classes Batch. Cette facon de proceder est simple, aussi bien pour le developpeur de la classe que pour l'utilisateur, mais elle se revele a terme penalisante dans la souplesse d'utilisation des classes. Elle permet aussi moins facilement de mettre en place une strategie de singleton pour les objets BatchManager, ce qui peut se reveler utile non pas en termes de performance mais plutot en termes de genericite et toujours de souplesse.
En resume, l'utilisation de fabiques permet d'acceder a la genericite, qui rappelons-le est l'objet de cette biliotheque, a la souplesse et a la performance au prix d'une legere complication pour le developpeur mais pas pour l'utilisateur.
Le catalogue de fabriques est une map, ou tableau associatif, auquel on passe le nom d'une fabrique et qui retourne un pointeur sur une instance de cette fabrique.
Le catalogue est renseigne statiquement par les fabriques declarees elles-memes statiquement dans la biliotheque. Il est donc precharge avec les fabriques correspondant a chacune des API disponibles. Comme le catalogue n'est pas declare constant, il est possible de rajouter ou de supprimer des fabriques dans le catalogue dynamiquement.
class BatchManagerCatalog { public: // Methode permettant de recuperer l'instance unique de catalogue static BatchManagerCatalog& getInstance(); // Accesseurs void addFactBatchManager(const char * type, Batch::FactBatchManager * pFBM); Batch::FactBatchManager * operator() (const char * type); // Wrapping Python virtual std::map<std::string, FactBatchManager *> * dict(); virtual std::string __repr__() const; protected: // Constructeur BatchManagerCatalog(); // Destructeur virtual ~BatchManagerCatalog(); // Le catalogue proprement dit std::map<std::string, FactBatchManager *> _catalog; // Mutex permettant d'assurer des acces "thread-safe" au catalogue pthread_mutex_t _mutex; private: // On interdit la copie de l'instance unique du catalogue (singleton) BatchManagerCatalog(const BatchManagerCatalog & orig); BatchManagerCatalog& operator=(const BatchManagerCatalog & orig); };
... // On recupere l'instance du catalogue de gestionnaires de batch Batch::BatchManagerCatalog cata = Batch::BatchManagerCatalog::getInstance(); ...
Cette methode retourne l'instance unique du catalogue qui peut ensuite etre utilisee pour ajouter ou recuperer des fabriques.
Cet accesseur enregistre dans le catalogue un pointeur sur un objet de type FactBatchManager sous le nom (le type) passe en argument.
Cet accesseur retourne un pointeur sur un objet de type FactBatchManager en fonction du nom (le type) sous lequel il s'est enregistre dans le catalogue.
Cette methode utilisable depuis Python permet de recuperer un dictionnaire decrivant le contenu du catalogue.
Cette methode utilisable depuis Python retourne une description de l'objet BatchManagerCatalog.
Le constructeur par defaut est declare "protected" et ne peut donc pas etre utilise pour creer une nouvelle instance de BatchManagerCatalog. En effet, le catalogue est un singleton, ce qui signifie qu'une seule instance du catalogue existe. Pour recuperer cette instance, il faut utiliser la methode BatchManagerCatalog::getInstance().
De la meme maniere, le destructeur est declare "protected" et ne peut pas etre utilise pour detruire l'instance de catalogue. Le singleton est detruit automatiquement a la fin du programme.