C++ 建造者模式示例

#include <iostream>

using namespace std;

enum SEX_E
{
    SEX_F,
    SEX_M
};

enum ROLE_E
{
    ROLE_STUDENT,
    ROLE_WORKER,
    ROLE_BUTT
};

class Person
{
public:
    int mAge;
    SEX_E mSex;
    ROLE_E mRole;
    string mSchool;
    string mCompany;

    void print()
    {
        cout << "mAge" << ":\t" << mAge << endl;
        cout << "mSex" << ":\t" << mSex << endl;
        cout << "mRole" << ":\t" << mRole << endl;
        cout << "mSchool" << ":\t" << mSchool.c_str() << endl;
        cout << "mCompany" << ":\t" << mCompany.c_str() << endl;
    }
};

class Builder
{
public:   
    Person* BuildWorker(int age, SEX_E sex, string extendInfo)
    {
        Person* pstPerson = new Person();
        if (nullptr == pstPerson)
        {
            return nullptr;
        }
        pstPerson->mAge = age;
        pstPerson->mSex = sex;
        pstPerson->mRole = ROLE_WORKER;     
        pstPerson->mCompany = extendInfo;
        return pstPerson;
    }

    Person* BuildStudent(int age, SEX_E sex, string extendInfo)
    {
        Person* pstPerson = new Person();
        if (nullptr == pstPerson)
        {
            return nullptr;
        }
          
        pstPerson->mAge = age;
        pstPerson->mSex = sex;
        pstPerson->mRole = ROLE_STUDENT;     
        pstPerson->mSchool = extendInfo;
        return pstPerson;
    }
};

class Director
{
public:
    Person* buildPerson(int age, SEX_E sex, ROLE_E role, string extendInfo)
    {
        Builder* pstBuilder = new Builder();
        if (nullptr == pstBuilder)
        {
            return nullptr;
        }
        
        Person* pstPerson = nullptr;
        if (ROLE_STUDENT == role)
        {
            pstPerson = pstBuilder->BuildStudent(age, sex, extendInfo);
        }
        else if (ROLE_WORKER == role)
        {
            pstPerson = pstBuilder->BuildWorker(age, sex, extendInfo);
        }
        delete pstBuilder;
        pstBuilder = nullptr;
        return pstPerson;
    }
};

int main()
{
    cout << "enter" << endl;

    Director *pstDirector = new Director();
    if (nullptr == pstDirector)
    {
        cout << "new director failed." << endl;
        return -1;
    }

    Person* pstStudent = pstDirector->buildPerson(10, SEX_F, ROLE_STUDENT, "primary school");
    if (nullptr == pstStudent)
    {
        cout << "build student failed." << endl;
        delete pstDirector;
        pstDirector = nullptr;
        return -1;
    }
    pstStudent->print();
    delete pstStudent;
    pstStudent = nullptr;

     Person* pstWorker = pstDirector->buildPerson(30, SEX_M, ROLE_WORKER, "scientific and technical corporation");
    if (nullptr == pstWorker)
    {
        cout << "build worker failed." << endl;
        delete pstDirector;
        pstDirector = nullptr;
        return -1;
    }
    pstWorker->print();
    delete pstWorker;
    pstWorker = nullptr;   

    delete pstDirector; 
    pstDirector = nullptr;

    cout << "exit" << endl;
    return 0;
}

执行结果

PS E:\workspace\sample\Builder> g++ main.cpp
PS E:\workspace\sample\Builder> ./a
enter
mAge:   10
mSex:   0
mRole:  0
mSchool:        primary school
mCompany:
mAge:   30
mSex:   1
mRole:  1
mSchool:
mCompany:       scientific and technical corporation
exit
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值