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

问题描述 投票:3回答:3

我是一个相对较新的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();
}
c++ design-patterns factory factory-pattern
3个回答
3
投票

这不是实现工厂模式的典型方法,主要原因是工厂类通常不是其创建的类的基础。有关何时使用继承的常见指导原则是“确保公共继承模型为“ is-a””。在您的情况下,这意味着Derived0Derived1类型的对象也应为Base类型,并且派生类应表示比Base更专业的概念。

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

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


1
投票

您的工厂还可以,但是您合并了工厂和接口,打破了SRP原则。

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


0
投票

为什么我们确实需要在工厂方法中使用静态函数,我们可以对普通成员函数执行相同的操作,并且可以使用工厂指针变量进行访问?有人可以分辨一下吗

© www.soinside.com 2019 - 2024. All rights reserved.