如果其中一个具体的构建器需要额外的参数,如何创建统一的接口来构建构建器模式中的构建器?

How to create uniform interface to build for builders in builder patterns, if one of concrete builders take extra argument?

class Builder 
{
  public:
   virtual void Build(int a) = 0;
};

class ConcreteBuilder1 : public Builder
{
  public:
    void Build(int a);
};

class ConcreteBuilder2 : public Builder
{
  public:
    void Build(int a. struct A* a);
};

所以我的问题是如何设计 Build() 方法来获取两个参数(int、struct* A)。但是具有相同的生成器界面?

这样,

int x;
struct A* y;
Builder concrteBuilder1 = new ConcreteBuilder1(); 
concrteBuilder1 ->Build() // //  Here I am  forced to pass struct A* a eventhough not needed for concerte builder1 . And I am also forced to forced to change Builder interface too.

如果我没有清楚地表达问题,我深表歉意。

添加

using Builder::Build;

派生的 class 的声明。这会将此符号导入派生的 class,并使其和派生的 class 方法同名,可用于重载解析。即

using Builder::Build;

void Build(int a);

我忽略了这样一个事实,即您无论如何都无法构造派生的 class,因为它无法从基础 class.

实现这个纯虚函数

从具有相同参数和相同 return 值的函数派生 class 覆盖它们的函数。

因此,如果您声明一个函数,例如...

class Builder 
{
  public:
   virtual void Build() = 0;
};

class ConcreteBuilder1 : public Builder
{
  public:
    void Build(int a);
};

class ConcreteBuilder2 : public Builder
{
  public:
    void Build(int a. struct A* a);
};

此处,ConcreteBuilder1 中的 Build 函数 class 被视为新函数,而不是覆盖函数。

所以试试这个。

class Builder 
{
  public:
   virtual void Build(int a, A* b = 0) = 0;
};

class ConcreteBuilder1 : public Builder
{
  public:
    void Build(int a);
};

class ConcreteBuilder2 : public Builder
{
  public:
    void Build(int a, struct A* a);
};

希望对你有所帮助。

Builder 通常构建另一个 class 的对象。您可以尝试类似的操作:

class ToBuild
{
    //some code here
};

class Builder
{
public:
    virtual ToBuild * build() = 0;
};

class ConcreteBuilder : public Builder
{
    int _valA;
    int _valB;
public:
    ToBuild * build() override
    {
        ToBuild * obj = new ToBuild();
        //initalize obj using _valA and _valB variables;
        return obj;
    }
    
    ConcreteBuilder& valA(const int val)
    {
        _valA = val;
        return *this;
    }
    
    ConcreteBuilder& valB(const int val)
    {
        _valB = val;
        return *this;
    }
    
};

int main()
{
     ConcreteBuilder b;
     ToBuild * obj = b.valA(1).valB(2).build();
     //some code
     delete obj;
     return 0;
}

[编辑] 您可以编写另一个派生 class 并使用任意数量的参数,并且仍然使用单个 'build' 方法。