处理抽象工厂中的具体类爆炸

时间:2009-08-21 16:59:33

标签: c++ design-patterns

如使用抽象工厂的动机所述,我需要一个我想要高度灵活的界面,即它应该有许多可能的行为。因此,遵循AF设计模式,我定义了一个带有接口函数的抽象类,如下所示:

class WidgetFactory{
...
public:
       CreateScrollBar();
       CreateButton();
...
};

然后我为每个行为定义WidgetFactory的具体子类,每个子类实现特定行为的接口。

我的问题是我的界面非常大,即我在抽象类中有10个函数,每个函数有4个可能的实现。所以事实证明,我必须实现4 ^ 10个子类来解释每个可能的行为。任何想法或建议我怎么能避免这种指数爆炸?

5 个答案:

答案 0 :(得分:2)

为每个独立接口设置一个单独的工厂,然后有一个主工厂,您可以在那里注册所有的小工厂。

class ScrollBarFactory
{
    public:
        CreateScrollBar();
};
class ButtonFactory
{
    public:
        CreateButton();
};


// I just used templates as a quick example
// This can be doen in many ways. I hope you get the idea.
template<typename SF,typename BF>
class WidgetFactory
{
    public:
        CreateScrollBar()   {scrollbarFactory.CreateScrollBar();}
        CreateButton()      {buttonFactory.CreateButton();}
    private:
        SF    scrollbarFactory;
        BF    buttonFactory;
};

答案 1 :(得分:1)

如果这10个函数中的每个函数都有4个实现,并且它们彼此独立(你强烈暗示你需要做所有的组合),那么它们不应该是在一个工厂里。为每个接口创建一个单独的接口,并单独实现。

答案 2 :(得分:0)

通常我们不希望拥有所有可能的功能组合。

例如,我们不会将Windows CreateScrollBar和Linux CreateButton混合在一起。

那么,对于每种方法,您的4种不同的实现是否自然地以这种方式组合?所以你有一个WindowsWidgetFactory和一个LinuxWidgetFactory - 这个想法对你有用吗?

如果没有,那么我怀疑这里还有其他事情发生。对于非常精细的行为控制,可能需要某种数据驱动的方法。你能告诉我们一些你需要建立的不同口味吗?

答案 3 :(得分:0)

在抽象工厂中使用类似命令模式的东西是一种选择。您将工厂应执行的命令传递给工厂。这使得每个实现1个命令,一个接口和1个工厂可以完成所有4个以上的命令。

有关设置的更多信息可能会有所帮助。

答案 4 :(得分:0)

实际上这个问题在GoF书中讨论过。解决方案是使用Bridge模式。但我不确定你是否有同样的问题,因为我觉得这很奇怪

  

我在抽象类中有10个函数,每个函数有4个可能的实现。事实证明,我必须实现4 ^ 10个子类来解释每种可能的行为。

不能得到它,你怎么得到这么多?如果你需要制作一个非常灵活的界面,并且需要对窗口进行一些添加,比如实现滚动条,添加边框添加specil边框并为此生成类,那么更好的解决方案是使用装饰器模式。这样可以轻松地将滚动条,边框和任何内容组合在一起。