Face au besoin de sérialisation d'objets en C, beaucoup ont recours à un modèle familier qui implique une commutation basée sur l'ID de classe :
<code class="cpp">class Serializable { public: static Serializable *deserialize(istream &is) { int id; is >> id; switch(id) { case EXAMPLE_ID: return new ExampleClass(is); //... } } void serialize(ostream &os) { os << getClassID(); serializeMe(os); } protected: int getClassID()=0; void serializeMe(ostream &os)=0; };
Bien que cette approche puisse paraître intuitive, elle souffre de pièges potentiels :
L'approche Factory Pattern
Une approche plus élégante et extensible La solution consiste à utiliser le modèle d'usine. Au lieu de s'appuyer sur des ID de classe, une classe d'usine crée des objets basés sur un ensemble enregistré de paires clé-fonction. Les fonctions renvoient des instances des classes correspondantes.
<code class="cpp">template<typename K, typename T> class Factory { typedef T *(*CreateObjectFunc)(); std::map<K, CreateObjectFunc> mObjectCreator; template<typename S> static T* createObject(){ return new S(); } template<typename S> void registerClass(K id){ mObjectCreator.insert( std::make_pair<K,CreateObjectFunc>(id, &createObject<S> ) ); } T* createObject(K id){ typename std::map<K, CreateObjectFunc>::iterator iter = mObjectCreator.find(id); if (iter == mObjectCreator.end()){ return NULL; } return ((*iter).second)(); } };</code>
Dans cette implémentation, chaque classe d'intérêt est enregistrée auprès de l'usine, associant son ID de classe à une fonction de création. Lorsqu'un objet doit être désérialisé, l'usine est interrogée pour connaître l'ID de classe correspondant. Si elle est trouvée, la fonction de création est invoquée pour instancier l'objet.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!