我是一个相对较新的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();
}
这不是实现工厂模式的典型方法,主要原因是工厂类通常不是其创建的类的基础。有关何时使用继承的常见指导原则是“确保公共继承模型为“ is-a””。在您的情况下,这意味着Derived0
或Derived1
类型的对象也应为Base
类型,并且派生类应表示比Base更专业的概念。
但是,工厂模式几乎总是涉及继承,因为工厂将返回指向基本类型的指针(您也这样做)。这意味着客户端代码不需要知道工厂创建的对象类型,只需知道它与基类的接口匹配即可。
关于具有静态创建功能,取决于情况。如您的示例所示,优点之一是您无需创建工厂实例即可使用它。
您的工厂还可以,但是您合并了工厂和接口,打破了SRP原则。
而不是在基类中创建create静态方法,而在另一个(工厂)类中创建它。
为什么我们确实需要在工厂方法中使用静态函数,我们可以对普通成员函数执行相同的操作,并且可以使用工厂指针变量进行访问?有人可以分辨一下吗