工厂应该负责重建序列化物体吗?

时间:2013-04-14 19:55:36

标签: c++ oop factory-pattern

我正在做一个我必须实现抽象工厂模式的作业。我得到了一个工厂类的模板,我需要实现(并适应)以使测试程序通过。

模板如下所示:

typedef Shape *(createShapeFunction)(void);
/* thrown when a shape cannot be read from a stream */

class WrongFormatException { };

class ShapeFactory
{
    public:
        static void registerFunction(const std::string &, const createShapeFunction *);
        static Shape *createShape(const std::string &);
        static Shape *createShape(std::istream &);

    private:
        std::map<std::string, createShapeFunction *> creationFunctions;

        ShapeFactory();
        static ShapeFactory *getShapeFactory();
};

createShape方法的第一个重载是直接的,但第二个重载用于需要工厂知道其产品如何序列化的场景。

更确切地说:生成一堆具有随机参数的形状,序列化为流,然后将流馈送到第二个重载,以便逐个重建对象。

根据我对OOP的了解,这似乎不正确,因为以这种方式反序列化对象将意味着它们如何被序列化,这不可避免地导致违反封装原则(通过泄漏有关产品的实现细节)工厂)。

这是对的还是我错过了什么?

2 个答案:

答案 0 :(得分:1)

我认为您的工厂类很好,并且没有违反OO设计的任何 SOLID 原则。

工厂应该知道它创造的类有什么共同之处。换句话说:它知道基类不变量,包括表示有效对象的流标记。在输入错误的情况下抛出异常是完全有效的。由于该知识存储在注册表中,因此类本身不依赖于具体的类,而只依赖于抽象基类(Dependency Inversion Principle)。

在编译时它不知道的是整个类层次结构。这种知识仅在运行时通过其注册表显而易见。这有效地将静态类型切换变为动态映射查找,这是OO中多态性的首选使用,并且可以轻松构建新的子类而无需修改工厂类(所谓的 Open/Closed Principle )。

答案 1 :(得分:0)

我没有阅读作业,但认为你可能误解了第二个 createShape 的功能。如果没有,我道歉,但这就是我的想法。

第一个 createShape 获取一个单独的键(形状名称),然后创建它。你说的很直接。

第二个 createShape 接收已经创建和序列化的一堆形状(如您所述),但是一堆键。它获取一个包含一组键的流,然后迭代在所有这些键上创建所有相应的形状。我认为,这意味着要批量创建形状。

这可能是作业的一部分,因此您告诉您如何使用迭代器

我会添加代码,但这会是作弊; )