c++ - 工厂方法在这里合适吗?

标签 c++ design-patterns factory

我正在生成一系列 Step 对象,它们因“类型”和其中包含的数据而异。例如:

Step 对象基本上应该是这样的结构

{ GRAB, CASCADE_ONE, FACEUP, SOMEOTHERDATA },
{ DROP, DECK,  FACEDOWN, MOREDATA, ANDSOMEMORE },
{ MOVE, 34, 89 },

其中GRABMOVEDROP表示StepType:

typedef enum
{
     GRAB,
     DROP,
     MOVE
}StepType;

如您所见,根据 StepType,这些结构在 StepType 之后都有可变数量的数据字段。

我计划迭代这些结构的序列并根据 StepType 字段执行特定操作。我的第一个直觉是这些应该是派生自抽象 Step 类的类的对象 - 即我应该创建一个 GrabStep 类,一个 MoveStep 类和一个 DropStep 类。

这是一个好的设计吗?如果是的话,我应该使用工厂方法来创建它们吗?如果工厂方法是可行的方法,那么如何初始化对象中的字段?

最佳答案

你不需要工厂模式。但是创建一个抽象的 Step 类是一个好的开始:

class Step
{
private:
    // The presence of a pure virtual makes this class abstract.
    virtual void DoAction() = 0;
public:
    virtual ~Step() {} // Needed if you are going to delete via a Step* pointer
    void Action() { DoAction(); } // Template method pattern
};

// All other classes derive publicly from Step, since they all have an "is-a"
// relationship with Step (i.e. a GrabStep "is-a" Step).
class GrabStep : public Step
{
private:
    void DoAction() { /* Do whatever a GrabStep does */ };
    // Data relevant to GrabStep
};

class MoveStep : public Step
{
private:
    void DoAction() { /* Do whatever a MoveStep does */ };
    // Data relevant to MoveStep
};

class DropStep : public Step
{
private:
    void DoAction() { /* Do whatever a DropStep does */ };
    // Data relevant to DropStep
};

然后,您可以迭代这些东西而不必知道它们的确切类型:

// Example:
std::vector<Step*> seq; // or some other container
// Note that we are storing Step* pointers in a container instead of Step
// objects. This is needed for polymorphism to work.
// ...
seq.push_back(new GrabStep);
seq.push_back(new MoveStep);
seq.push_back(new DropStep);
// ...
for(std::vector<Step*>::iterator i = seq.begin(); i != seq.end(); ++i)
{
    // Will call the proper version of DoAction() depending on the actual type.
    (*i)->Action();
}
// ...
// After we are done, clean up after ourselves. This is needed because
// std::vector does not delete the pointees.
for(std::vector<Step*>::iterator i = seq.begin(); i != seq.end(); ++i)
{
    delete (*i); // Safe because Step has a virtual destructor.
}

关于c++ - 工厂方法在这里合适吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3226808/

相关文章:

php - 单元测试分离

java - 如何正确地将工厂方法应用到DAO工厂中?

c# - 实现一个非泛型的静态工厂方法以从字符串输入创建各种泛型类(不使用 "dynamic"类型)

c++ - 在字符串中搜索十六进制子串

c++ - 从 ‘char’ 到 ‘const char*’ 的无效转换

c++ - 局部变量在编译时存储在哪里?

c++ - 逆变类型和可扩展性

java - 如何从数据库访问代码中抽象出业务逻辑和对象定义?

language-agnostic - 接口(interface)与公共(public)类成员

c++ - 在 C++ 中拆分硬件相关类