建设者的设计模式不适合我

Builder design pattern does not work for me

本文关键字:不适合 设计模式 建设者      更新时间:2023-10-16

我刚写的c++代码有问题。该代码是Builder设计模式的一个示例。我创建了一个抽象生成器类,以及从这个类继承的两个类:MonsterBuilder和RuffianBuilder。我创建了一个Builder类,这个类接收一个Monster或RuffianBuilder,并构造这些类的一个新实例。问题来了:如果MonsterBuilder类被用来构建一个新的实例,程序会以错误终止(a.exe已经停止工作)。如果生成器收到一个RuffianBuilder,它会构造一个没有错误的新实例。这是示例代码:

#include <iostream>
class Character
{
private:
    // Attributes
    int dex;
    int str;
    int end;
    // skills
    int lockpick;
    int guns;
    int sneak;
    /*****************************************  Setters  ********************************************************/
    // Attribute setters
public:
    void setStrength(const int &s)
    {
        this->str = s;
    }
    void setDexterity(const int &d)
    {
        this->dex = d;
    }
    void setEndurance(const int &e)
    {
        this->str = e;
    }
    // Skill setters
    void setLockpick(const int &s)
    {
        this->lockpick = s;
    }
    void setSneak(const int &s)
    {
        this->sneak = s;
    }
    void setGuns(const int &s)
    {
        this->guns = s;
    }
    int getGuns()
    {
        return this->guns;
    }
    int getStrength()
    {
        return this->str;
    }
};

/* Abstract builder */
class CharacterBuilder
{
protected:
    Character * int_character;
public: 
    Character * getCharacter()
    {
        return int_character;
    }
    void buildCharacter()
    {
        int_character = new Character;
    }
    virtual void buildSkills() = 0; 
    virtual void buildAttributes() = 0;
};
class MonsterBuilder : public CharacterBuilder
{
public:
    virtual void buildSkills()
    {
        int_character->setLockpick(10);
        int_character->setSneak(12);
        int_character->setGuns(50);
    }
    virtual void buildAttributes()
    {
        int_character->setStrength(5);
        int_character->setDexterity(5);
        int_character->setEndurance(5);
    }
};
class RuffianBuilder : public CharacterBuilder
{
public:
    virtual void buildSkills()
    {
        int_character->setLockpick(10);
        int_character->setSneak(12);
        int_character->setGuns(50);
    }
    virtual void buildAttributes()
    {
        int_character->setStrength(5);
        int_character->setDexterity(5);
        int_character->setEndurance(5);
    }
};
class Builder
{
public:
    void setBuilder(CharacterBuilder * builder)
    {
        this->builder = builder;
    }
    Character * getCharacter()
    {
        return builder->getCharacter();
    }
    void buildCharacter()
    {
        //std::cout << builder->buildSkills;
        builder->buildSkills();
        builder->buildAttributes();     
    }
private:
    CharacterBuilder * builder;
};
int main()
{
    Builder B;
    RuffianBuilder R;
    MonsterBuilder Mo;
    B.setBuilder(&R);
    B.buildCharacter();
    std::cout << B.getCharacter()->getGuns();
    std::cout << B.getCharacter()->getStrength();
    B.setBuilder(&Mo);
    B.buildCharacter();
    //std::cout << B.getCharacter()->getStrength();
    return 0;
}

是什么导致了这个问题?有人能解释一下吗?

读取未初始化的变量将导致未定义的行为。

我将builder->buildCharacter();添加到Builder::buildCharacter(),然后这个代码似乎工作得很好。

class Builder
{
public:
    void setBuilder(CharacterBuilder * builder)
    {
        this->builder = builder;
    }
    Character * getCharacter()
    {
        return builder->getCharacter();
    }
    void buildCharacter()
    {
        //std::cout << builder->buildSkills;
        builder->buildCharacter(); // add this line
        builder->buildSkills();
        builder->buildAttributes();     
    }
private:
    CharacterBuilder * builder;
};