我正在做一个作业,我必须在其中实现抽象工厂模式。我得到了一个工厂类的模板,我需要实现(和调整)它以使测试程序通过。
模板如下所示:
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 的了解,这似乎不正确,因为以这种方式反序列化对象意味着了解它们是如何序列化的,这不可避免地导致违反封装原则(将产品的实现细节泄露给工厂) .
这是对的还是我错过了什么?