创建型设计模式:生成器

生成器模式是一种设计模式,它将对象的构造过程逐步分解,允许创建不同类型的对象而无需重复的构造代码。当需要向构造函数传递大量可选参数时,此模式尤其有用。示例展示了如何使用生成器来构建不同配置的汽车对象。
摘要由CSDN通过智能技术生成

概念

此模式能够分步骤创建复杂对象(比如一个对象在对其进行构造时需要对诸多成员变量和嵌套对象进行繁复的初始化工作)。允许使用相同的创建代码生成不同类型和形式的对象。

具体操作

将对象构造代码从产品类中抽取出来,并将其放在一个名为生成器的独立对象中。将对象构造过程划分为一组步骤,每次创建对象时,都需要通过生成器对象执行一系列步骤。重点在于无需调用所有步骤,而只需调用创建特定对象配置所需的那些步骤即可。

使用场景

当发现要向构造函数传递大量参数而其中有些参数在某些时候又不是必须的时。

示例

struct Car
{
    int seatsNumber;
    QString engine;
    bool GPS;
};

class Builder
{
public:
    virtual void reset() = 0;
    virtual void setSeats(int number) = 0;
    virtual void setEngine(QString engine) = 0;
    virtual void setGPS(bool GPS) = 0;
};

class CarBuilder : public Builder
{
public:
    CarBuilder()
    {
        reset();
    }
    void reset()
    {
        car = new Car;
    }
    void setSeats(int number)
    {
        car->seatsNumber = number;
    }
    void setEngine(QString engine)
    {
        car->engine = engine;
    }
    void setGPS(bool GPS)
    {
        car->GPS = GPS;
    }

    Car *getCar()
    {
        Car * car = this->car;
        reset();
        return car;
    }

private:
    Car * car{nullptr};
};

int main(int argc, char *argv[])
{
    CarBuilder carBuilder;

    //创建一辆3个座位支持GPS的宇宙牌引擎的车
    carBuilder.setSeats(3);
    carBuilder.setGPS(true);
    carBuilder.setEngine("宇宙牌");
    Car * car = carBuilder.getCar();

    //创建一辆100个座位不支持GPS的无引擎的车
    carBuilder.setSeats(100);
    carBuilder.setGPS(false);
    car = carBuilder.getCar();
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值