使用空基类来强制抽象工厂的继承是不好的做法吗?

时间:2018-05-16 04:14:44

标签: c++ factory abstract-factory

我有一个名为A的类,并说一些基于A的继承类。 我不是为了节省一些空间而在这里包括它们,而是假设我们为A派生了一个需要工厂的类。 B类也是如此。

struct A
{
    ...
}; 

struct B
{
    ...
};

// start of factory code
//
struct empty_base_factory
{
};

struct factoryA : public empty_base_factory
{
    shared_ptr<A> make_object() { return ... }
};

struct factoryB : public empty_base_factory
{
    shared_ptr<B> make_object() { return ... }
};

class abstract_factory
{
    std::map< uint8_t, std::shared_ptr<empty_base_factory> > iv_factories;

    public:
        abstract_factory()
        {
            iv_factories[0] = make_shared<factoryA>();
            iv_factories[1] = make_shared<factoryB>();
           // .. I might several more similar to this
        }

        std::shared_ptr<empty_base_factory> make_factory(const uint8_t i_key)
        {
             return iv_factories[i_key];
        }
};

感觉我正在使用empty_base_factory强制进行不自然的继承,以便让我在书中找到的这种实现很好地工作。 make_object是一个使empty_base_factory成为接口的接口方法,但make_object的返回类型不同,我不知道如何处理它。

这是通过强制使用空基类来尝试实现抽象工厂的一种不好的方法吗?想法?

1 个答案:

答案 0 :(得分:0)

  

这是一种尝试实现抽象工厂的糟糕方式   强制使用空基类?想法?

如果它只是空的话,你不需要“empty_base_factory”。

Abstract Factory设计模式中:

  

抽象工厂模式提供了一种封装一组的方法   具有共同主题但未指定其主题的各个工厂   具体课程

在您的情况下:abstract_factory依赖于factoryAfactoryB(这是您的具体工厂)来创建具体对象。用户对这些混凝土工厂的存在一无所知。

回到你的问题:它与抽象工厂设计模式并不真正相关。

没有停止定义抽象基类BaseFactory,它定义了工厂的基本功能(例如make_object())。 BaseFactory中的虚函数是您的具体工厂应该实现的。

相关问题