首頁 >後端開發 >C++ >如何使用工廠模式在 C 中優雅地將類別序列化為流?

如何使用工廠模式在 C 中優雅地將類別序列化為流?

Linda Hamilton
Linda Hamilton原創
2024-10-29 02:45:29980瀏覽

How to Elegantly Serialize Classes to a Stream in C   Using the Factory Pattern?

揭秘類的序列化到流

當面對C 中的對象序列化需求時,許多人採用一種熟悉的模式,涉及基於類ID的切換:

<code class="cpp">class Serializable {
  public:
    static Serializable *deserialize(istream &amp;is) {
        int id;
        is >> id;
        switch(id) {
          case EXAMPLE_ID:
            return new ExampleClass(is);
          //...
        }
    }

    void serialize(ostream &amp;os) {
        os << getClassID();
        serializeMe(os);
    }

  protected:
    int getClassID()=0;
    void serializeMe(ostream &amp;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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn