當面對C 中的對象序列化需求時,許多人採用一種熟悉的模式,涉及基於類ID的切換:
<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; };
雖然這種方法看起來很直觀,但它存在潛在的陷阱:
工廠模式方法
一種更優雅和可擴展的方法解決方案是採用工廠模式。工廠類別不依賴類別 ID,而是根據一組已註冊的鍵函數對建立物件。這些函數會傳回對應類別的實例。
<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>
在此實作中,每個感興趣的類別都向工廠註冊,將其類別 ID 與建立函數相關聯。當要反序列化物件時,會在工廠中查詢對應的類別 ID。如果找到,則呼叫建立函數來實例化該物件。
以上是如何使用工廠模式在 C 中優雅地將類別序列化為流?的詳細內容。更多資訊請關注PHP中文網其他相關文章!