我是一个相对较新的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();
}
答案 0 :(得分:3)
这不是实现工厂模式的典型方法,主要原因是工厂类通常不是它创建的类的基础。何时使用继承的一个共同准则是“确保公共继承模型”是一个“”。在您的情况下,这意味着Derived0
或Derived1
类型的对象也应该是Base
类型,派生类应该代表比Base更专业的概念。
但是,工厂模式几乎总是涉及继承,因为工厂将返回指向基类型的指针(你也这样做)。这意味着客户端代码不需要知道工厂创建的对象类型,只需要知道它与基类的接口匹配。
关于具有静态创建功能,它取决于具体情况。正如您的示例所示,一个优点是您无需创建工厂实例即可使用它。
答案 1 :(得分:1)
您的工厂没问题,除了您合并工厂和界面这一事实,违反了SRP原则。
不是在基类中创建create static方法,而是在另一个(工厂)类中创建它。