3

Abstract Factory パターンを実装する必要がある宿題に取り組んでいます。テスト プログラムを成功させるために実装 (および適応) する必要があるファクトリ クラスのテンプレートが与えられます。

テンプレートは次のようになります。

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は簡単ですが、2 番目のオーバーロードは、製品がどのようにシリアル化されているかを工場に知らせる必要があるシナリオで使用されます。

より正確に言えば、ランダムなパラメーターを持つ形状の束が生成され、ストリームにシリアル化され、オブジェクトを 1 つずつ再構築するためにストリームが 2 番目のオーバーロードに供給されます。

オブジェクトをこの方法で逆シリアル化すると、オブジェクトがどのようにシリアル化されるかについての知識が暗示され、必然的にカプセル化の原則に違反することになるため、OOP について私が学んだことによると、これは正しくないようです (製品に関する実装の詳細を工場に漏らすことにより)。 .

これは正しいですか、それとも何か不足していますか?

4

2 に答える 2