Rumah >pembangunan bahagian belakang >C++ >Bagaimana untuk Mensiri Kelas dengan Elegan ke Strim dalam C Menggunakan Corak Kilang?
Apabila berhadapan dengan keperluan untuk pensirilan objek dalam C , ramai yang menggunakan corak biasa yang melibatkan penukaran berasaskan ID kelas :
<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; };
Walaupun pendekatan ini kelihatan intuitif, ia mengalami masalah yang berpotensi:
Pendekatan Corak Kilang
Lebih elegan dan boleh diperluaskan penyelesaiannya ialah menggunakan corak kilang. Daripada bergantung pada ID kelas, kelas kilang mencipta objek berdasarkan set pasangan fungsi kunci berdaftar. Fungsi mengembalikan tika kelas yang sepadan.
<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>
Dalam pelaksanaan ini, setiap kelas minat didaftarkan dengan kilang, mengaitkan ID kelasnya dengan fungsi penciptaan. Apabila objek hendak dinyahsiri, kilang ditanya untuk ID kelas yang sepadan. Jika ditemui, fungsi penciptaan digunakan untuk membuat instantiate objek.
Atas ialah kandungan terperinci Bagaimana untuk Mensiri Kelas dengan Elegan ke Strim dalam C Menggunakan Corak Kilang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!