1.建造者模式
建造者模式,又叫生成器模式,是一种对象构建模式,它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。
建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。
建造者模式的四个角色:
- Product(产品角色):一个具体的产品对象。
- Builder(抽象建造者):创建一个Product对象的各个部件指定的接口/抽象类。
- ConcreteBuilder(具体建造者):实现接口,构建和装配各个部件。
- Director(指挥者):构建一个使用Builder接口的对象。它主要是用于创建一个复杂的对象。它主要由两个作用,一是:隔离了客户与对象的生产过程,二是:负责控制产品对象的生产过程。
以下情形可以考虑使用建造者模式:
- 对象的创建复杂,但是其各个部分的子对象创建算法一定。
- 需求变化大,构造复杂对象的子对象经常变化,但将其组合在一起的算法相对稳定。
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.建造者模式优缺点
优点 | 缺点 |
你可以分步创建对象, 暂缓创建步骤或递归运行创建步骤。 | 由于该模式需要新增多个类, 因此代码整体复杂程度会有所增加。 |
生成不同形式的产品时, 你可以复用相同的制造代码。 | |
单一职责原则。 你可以将复杂构造代码从产品的业务逻辑中分离出来。 |