我有一个名为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的返回类型不同,我不知道如何处理它。
这是通过强制使用空基类来尝试实现抽象工厂的一种不好的方法吗?想法?
答案 0 :(得分:0)
这是一种尝试实现抽象工厂的糟糕方式 强制使用空基类?想法?
如果它只是空的话,你不需要“empty_base_factory
”。
在Abstract Factory设计模式中:
抽象工厂模式提供了一种封装一组的方法 具有共同主题但未指定其主题的各个工厂 具体课程
在您的情况下:abstract_factory
依赖于factoryA
和factoryB
(这是您的具体工厂)来创建具体对象。用户对这些混凝土工厂的存在一无所知。
回到你的问题:它与抽象工厂设计模式并不真正相关。
没有停止定义抽象基类BaseFactory
,它定义了工厂的基本功能(例如make_object()
)。 BaseFactory
中的虚函数是您的具体工厂应该实现的。