2012-07-13 77 views
1

假设有如下的工厂。我想知道是否有可能不包含ObjectA.h和ObjectB.h。工厂设计模式问题

目录结构
工厂

| -----对象A

| -----对象B

因为我不想以包括子头文件目录,有没有办法做到这一点? 如果有新的objectC,则不需要修改工厂类。如果类型是“TypeC”,它将自动创建ObjectC。

#include "ObjectA.h" 
#include "ObjectB.h" 

object* create(const string& type) 
{ 
    if (type == "typeA") 
    { 
     return new ObjectA(); 
    } 
    else 
    { 
     return new ObjectB(); 
    } 
}; 
+0

这可能对你有用,请看这里http://www.codeproject.com/Articles/363338/Factory-Pattern-in-Cplusplus和这里http://stackoverflow.com/questions/ 8719119 /坏实践返回唯一ptr为原始类指针所有权语义 – rsc 2012-07-13 06:44:17

+0

谢谢。这真的很有帮助。但是,注册函数调用在工厂的构造器中。我只是想知道把它放在具体的课堂上是否可行。 – 2012-07-13 09:01:16

回答

1

是的,将实现分离为一个实现文件,并且只包含那里的文件,只在头中提供函数原型。

要实际呼叫new ObjectA();new ObjectB();,您的必须将包括在呼叫站点中。

//factory.h 
object* create(const string& type); 

//factory.cpp 
#include "factory.h" 
#include "ObjectA.h" 
#include "ObjectB.h" 

object* create(const string& type) 
{ 
    if (type == "typeA") 
    { 
     return new ObjectA(); 
    } 
    else 
    { 
     return new ObjectB(); 
    } 
}; 
+0

如果工厂包含一个注册表,并且所有'object'派生类在使用之前都被注册了,那么这个代码可以大大改进。这将消除工厂功能中的“if-else”或“switch”。 – TemplateRex 2012-07-13 06:36:57

+0

@rhalbersma - 我以前也是这么想的。但是你付出的代价是某种全球性的对象/单身 - 这会导致以后各种各样的痛苦。国际海事组织更新单个文件是一个更便宜的价格支付..或者您可以生成该工厂.cpp文件作为您的构建过程的一部分。 – 2012-07-13 06:46:32

+0

@MichaelAnderson你不必为工厂使用单例/全局变量。您还可以将注册表存储在堆栈中的对象上,或者 - 通常情况下是这样 - 如果您需要让工厂比其使用的范围更长,则可以将其包装在shared_ptr中。 – TemplateRex 2012-07-13 08:36:47