考虑下面的代码:多态工厂
template <typename T>
class DrawerFactory
{
protected:
DrawerFactory() {};
private:
virtual shared_ptr<IDrawer> GetDrawer(T settings) = 0;
};
class ConcreteDrawerFactoryA : public DrawerFactory<SettingsA>
{
public:
shared_ptr<IDrawer> GetDrawer(SettingsA settingsA) override
{
if (settingsA.style == A) return make_shared<ConcreteDrawerA>(settingsA.length, settingsA.stroke, settingsA.opacity);
else return make_shared<ConcreteDrawerB>(20, .5);
};
};
class ConcreteDrawerFactoryB : public DrawerFactory<SettingsB>
{
public:
shared_ptr<IDrawer> GetDrawer(SettingsB settingsB) override
{
if (settingsB.type == TYPEC) return make_shared<ConcreteDrawerC>(settingsB.width, settingsB.height);
else return make_shared<ConcreteDrawerD>(10, 2);
};
};
我可以得到一个抽屉:
ConcreteDrawerFactoryA().GetDrawer(settingsa);
或
ConcreteDrawerFactoryB().GetDrawer(settingsb);
我希望做的是:
DrawerFactory().GetDrawer(settingsa);
DrawerFactory().GetDrawer(settingsb);
有没有办法设置这个,而不必不断地为我想添加的每个混凝土工厂添加超载到DrawerFactory
?
唯一的办法是投''里面GetDrawer' Settings'。更多的面向对象解决方案是让'Settings'处理“通用”名称 - 值对,比如'settings.getInt(“width”)' – Arkadiy
'DrawerFactory()'是没有意义的,因为DrawerFactory具有纯虚拟方法。 .. – jpo38
jpo38:我知道它不会以我想要的方式工作,因此问题 –