【问题标题】:factory design pattern issue工厂设计模式问题
【发布时间】:2012-07-13 05:43:31
【问题描述】:

假设有如下工厂。我想知道是否可以不包括 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();
    }
};

【问题讨论】:

标签: c++ factory-pattern


【解决方案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();
    }
};

【讨论】:

  • 如果工厂包含注册表并且所有object 派生类在使用前都已注册,则此代码可能会得到很大改进。这将消除工厂函数中的if-elseswitch
  • @rhalbersma - 我曾经也这么认为.. 但是你付出的代价是某种全局对象/单例 - 这可能会导致以后的各种其他痛苦。 IMO 更新单个文件的成本更低。或者您可以生成该工厂 .cpp 文件作为构建过程的一部分。
  • @MichaelAnderson 您不必为工厂使用单例/全局变量。您还可以将注册表存储在堆栈上的对象中,或者 - 通常情况下 - 如果您需要让工厂的寿命比使用它的范围更长,您可以将其包装在 shared_ptr 中。
  • @rhalbersma - 同意 - 我(错误地)以为您在谈论自动注册技巧,人们有时会尝试使用该技巧将构造函数添加到工厂内的注册表中。
猜你喜欢
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 1970-01-01
  • 2011-11-20
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多