建造者模式

1.建造者模式

建造者模式,又叫生成器模式,是一种对象构建模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。

建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

建造者模式的四个角色:

  1. Product(产品角色):一个具体的产品对象。
  2. Builder(抽象建造者):创建一个Product对象的各个部件指定的接口/抽象类。
  3. ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件。
  4. Director(指挥者):构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要由两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。

以下情形可以考虑使用建造者模式:

  1. 对象的创建复杂,但是其各个部分的子对象创建算法一定。
  2. 需求变化大,构造复杂对象的子对象经常变化,但将其组合在一起的算法相对稳定。

class Product1{

    public:

    std::vector parts_;

    void ListParts()const{

        std::cout << "Product parts: ";

        for (size_t i=0;i

            if(parts_[i]== parts_.back()){

                std::cout << parts_[i];

            }else{

                std::cout << parts_[i] << ", ";

            }

        }

        std::cout << "\n\n";

    }

};

class Builder{

    public:

    virtual ~Builder(){}

    virtual void ProducePartA() const =0;

    virtual void ProducePartB() const =0;

    virtual void ProducePartC() const =0;

};

class ConcreteBuilder1 : public Builder{

    private:

    Product1* product;

    public:

    ConcreteBuilder1(){

        this->Reset();

    }

    ~ConcreteBuilder1(){

        delete product;

    }

    void Reset(){

        this->product= new Product1();

    }

    void ProducePartA()const override{

        this->product->parts_.push_back("PartA1");

    }

    void ProducePartB()const override{

        this->product->parts_.push_back("PartB1");

    }

    void ProducePartC()const override{

        this->product->parts_.push_back("PartC1");

    }

    Product1* GetProduct() {

        Product1* result= this->product;

        this->Reset();

        return result;

    }

};

class Director{

    private:

    Builder* builder;

    public:

    void set_builder(Builder* builder){

        this->builder=builder;

    }

    void BuildMinimalViableProduct(){

        this->builder->ProducePartA();

    }

    

    void BuildFullFeaturedProduct(){

        this->builder->ProducePartA();

        this->builder->ProducePartB();

        this->builder->ProducePartC();

    }

};

void ClientCode(Director& director)

{

    ConcreteBuilder1* builder = new ConcreteBuilder1();

    director.set_builder(builder);

    std::cout << "Standard basic product:\n";

    director.BuildMinimalViableProduct();

    

    Product1* p= builder->GetProduct();

    p->ListParts();

    delete p;

    std::cout << "Standard full featured product:\n";

    director.BuildFullFeaturedProduct();

    p= builder->GetProduct();

    p->ListParts();

    delete p;

    // Remember, the Builder pattern can be used without a Director class.

    std::cout << "Custom product:\n";

    builder->ProducePartA();

    builder->ProducePartC();

    p=builder->GetProduct();

    p->ListParts();

    delete p;

    delete builder;

}

int main(){

    Director* director= new Director();

    ClientCode(*director);

    delete director;

    return 0;    

}

2.建造者模式优缺点

优点

缺点

你可以分步创建对象, 暂缓创建步骤或递归运行创建步骤。

由于该模式需要新增多个类, 因此代码整体复杂程度会有所增加。

生成不同形式的产品时, 你可以复用相同的制造代码。

单一职责原则。 你可以将复杂构造代码从产品的业务逻辑中分离出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值