我对“设计模式”还比较陌生,因为它们在正式的意义上被称为“设计模式”。我成为专业人士的时间不长,所以我对此还是个新手。
我们有一个纯虚拟接口基类。这个接口类显然提供了它的派生子类应该执行的功能的定义。软件中的当前使用和情况决定了我们想要使用哪种类型的派生子对象,所以我建议创建一个包装器,它将传达我们想要哪种类型的派生子对象,并返回一个指向新派生对象的基指针。据我所知,这个包装器是一个工厂。
我的一个同事在Base类中创建了一个静态函数来充当工厂。这给我带来了麻烦,原因有两个。首先,它似乎破坏了Base类的接口本质。在我看来,界面本身需要了解从它派生的孩子,这是错误的。
其次,当我试图在两个不同的Qt项目中重用Base类时,它会导致更多的问题。我在一个项目中实现了第一个类(可能只实现了这一个类的真正实现……虽然我想对另外两个功能使用相同的方法,这两个功能将有几个不同的派生类),但第二个是实际的应用程序,我的代码最终将在其中使用。我的同事创建了一个派生类,作为实际应用程序的测试器,而我则编写部分代码。这意味着我必须将他的头文件和cpp文件添加到我的项目中,这似乎是错误的,因为当我实现我的部分时,我甚至没有在项目中使用他的代码(但他会在完成时使用我的代码)。
我认为工厂真的需要成为基类的包装器而不是基类作为工厂的想法是正确的吗?
发布于 2011-02-14 20:57:02
是的,接口(基类)中的静态工厂方法要求它了解所有可能的实例化。这样,您就得不到Factory Method模式想要带来的任何灵活性。
Factory应该是一段独立的代码,由客户端代码用来创建实例。你必须决定在你的程序中的某处要创建哪个具体的实例。工厂方法允许您避免在您的客户端代码中传播相同的决策。如果稍后您想要更改实现(或为了测试),您只有一个地方可以编辑:例如,这可能是一个简单的全局更改,通过条件编译(通常用于测试),甚至通过依赖注入配置文件。
要注意客户端代码如何传达它想要的实现类型:这是重新引入依赖关系工厂的常见方式。
https://stackoverflow.com/questions/4992307
复制相似问题