Bonjour, je suis actuellement en train de réfléchir à la façon de faire un Gestionnaire de Ressource.
Je me suis penché sur la façon de faire de Laurent dans son tutoriel sur la création d'un ResourceManager. J'ai retenu l'idée de passer par un MediaManager afin de gérer efficacement les différents type de média qui seront proposés dans mon application. Cependant, je reste perplexe sur la façon de réaliser mon ResourceManager proprement.
Voici mon problème:
J'utilise les shared_ptr que propose la bibliothèque Boost. J'ai donc une map définis comme ceci:
Jusque là, tout va bien. J'ai réussi à gérer la demande de ressource, la création de la ressource si celle-ci n'est pas présente au sein de mon manager. Cependant, il se peut que la ressource ne soit plus utilisé à un instant t. Je voudrai donc la supprimer de ma map. Or, j'ai envie que cette tâche soit automatisé, et que ça soit le ResourceManager qui le fait automatiquement.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2typedef boost::shared_ptr<Resource> ResourcePtr; std::map<std::string, ResourcePtr> ressources;
Ma première solution est:
Passer mon ResourceManager en singleton. Puis dans le destructeur d'une resource, je fais appel à une méthode de mon ResourceManager:
En effet, si le compteur est égal à 1, cela veut dire qu'il n'est plus pointé que par mon shared_ptr de ma map. Et donc je peux le supprimer de la map.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 void update(Resource* res) { rechercher la ressource dans la map SI compteur de la ressource EGAL A 1 ALORS supprimer ressource de la map FIN SI }
Soucis: Le Singleton.
Je n'ai rien contre ce pattern, mais ici, je l'utilise uniquement pour avoir un accés global à mon ResourceManager, je pense pas que ça soit une bonne façon de faire.
Deuxième Solution:
Recréer une classe shared_ptr, celle-ci prendra en paramètre un foncteur. A ce foncteur dans son constructeur je lui passerai l'adresse du ResourceManager. Comme ça, à chaque fois qu'un shared_ptr est détruit, j'appelle ce foncteur. Puis le foncteur appellera la fonction update que je viens d'exposer plus haut.
J'aimerai savoir s'il n'existerai pas un pattern qui résoudrait mon problème ? J'ai l'impression de me prendre la tête, mais j'aimerai faire un ResourceManager qui ne me prenne plus la tête par la suite et qui soit vraiment automatisé.
En esperant avoir votre aide, je vous remercie d'avance.
eXa
Partager