首页  >  文章  >  后端开发  >  如何使用工厂模式在 C 中优雅地将类序列化为流?

如何使用工厂模式在 C 中优雅地将类序列化为流?

Linda Hamilton
Linda Hamilton原创
2024-10-29 02:45:29941浏览

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