在C ++中使用静态方法来实现工厂模式

时间:2013-10-01 20:05:57

标签: c++ design-patterns factory factory-pattern

我是一个相对较新的C ++程序员 在编写一些代码时,我在概念上创建了类似于下面代码的东西。当一位朋友指出这实际上是一种工厂模式时,我读到了关于模式并看到它是相似的。

在所有的例子中,我发现工厂模式总是使用一个单独的类来实现,例如class BaseFactory{...};,而不是我使用静态create()成员函数实现它。

我的问题是:
(1)这实际上是工厂模式吗? (2)代码似乎有效。我实施它的方式有什么不对吗? (3)如果我的实现是正确的,那么实现静态create()函数的优缺点是什么,而不是单独的BaseFactory类。

谢谢!

class Base {
    ...
    virtual ~Base() {}
    static Base* create(bool type);
}

class Derived0 : public Base {
    ...
};

class Derived1 : public Base {
    ...
};

Base* Base::create(bool type) {
    if(type == 0) {
        return new Derived0();
    }
    else {
        return new Derived1();
    }
}

void foo(bool type) {
    Base* pBase = Base::create(type);
    pBase->doSomething();
}

2 个答案:

答案 0 :(得分:3)

这不是实现工厂模式的典型方法,主要原因是工厂类通常不是它创建的类的基础。何时使用继承的一个共同准则是“确保公共继承模型”是一个“”。在您的情况下,这意味着Derived0Derived1类型的对象也应该是Base类型,派生类应该代表比Base更专业的概念。

但是,工厂模式几乎总是涉及继承,因为工厂将返回指向基类型的指针(你也这样做)。这意味着客户端代码不需要知道工厂创建的对象类型,只需要知道它与基类的接口匹配。

关于具有静态创建功能,它取决于具体情况。正如您的示例所示,一个优点是您无需创建工厂实例即可使用它。

答案 1 :(得分:1)

您的工厂没问题,除了您合并工厂和界面这一事实,违反了SRP原则。

不是在基类中创建create static方法,而是在另一个(工厂)类中创建它。