Builder 模式是一种创建对象的设计模式,它将对象的构建过程与其表示分离,允许按照步骤构建复杂对象。它提供了一种可读性强、灵活性高的方式来构建对象。
使用 Builder 模式时,通常会有以下几个核心角色:
Builder 模式的使用流程如下:
Builder 模式的使用场景和优点如下:
使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。比如一个餐厅菜品种类有限,但是可以有很多组合。
建造者模式在创建复杂对象时非常有用,特别是当对象的构建过程涉及多个步骤或参数时。它可以提供更好的灵活性和可维护性,同时使得代码更加清晰可读。
> 注意事项: 与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
示例代码如下
#include <iostream>
#include <string>
// 产品类
class Product
{
private:
int price;
std::string origin;
public:
void setPrice(int _price)
{
this->price = _price;
}
void setOrigin(const std::string &_origin)
{
this->origin = _origin;
}
void descriProduct()
{
std::cout << "price: $" << this->price << std::endl;
std::cout << "origin: " << this->origin << std::endl;
}
};
// 抽象创建者
class AbstratBuilder
{
public:
virtual void buildProductPrice(int _price) = 0;
virtual void buildProductOrigin(const std::string &_origin) = 0;
virtual Product &getProduct() = 0;
};
// 具体创建者
class Builder : public AbstratBuilder
{
private:
Product *product;
public:
Builder()
{
this->product = new Product();
}
void buildProductOrigin(const std::string &_origin)
{
product->setOrigin(_origin);
}
void buildProductPrice(int _price)
{
product->setPrice(_price);
}
Product &getProduct()
{
return *product;
}
};
// 指导者
class Diretor
{
public:
void Construct(Builder &builder)
{
builder.buildProductPrice(100);
builder.buildProductOrigin("China");
builder.getProduct().descriProduct();
}
};
int main(int argc, char const *argv[])
{
Builder *builder = new Builder();
Diretor director;
director.Construct(*builder);
return 0;
}
首先定义了一个产品类 Product
,其中包含了产品的属性和描述产品的方法。然后,我们定义了一个抽象创建者类 AbstractBuilder
,其中定义了构建产品的纯虚函数,并提供了获取产品的方法。
接下来,我们创建了具体创建者类 Builder
,它继承了抽象创建者类,并实现了构建产品的方法。在具体创建者中,我们创建了一个产品对象,并在构建方法中设置了产品的属性。最后,我们定义了一个指导者类 Director
,它接收一个具体创建者对象,并调用创建者的方法来构建产品。
在客户端代码中,我们实例化了具体创建者对象 Builder
,然后将其传递给指导者 Director
的 Construct
方法。指导者根据特定的顺序调用创建者的方法来构建产品,并通过创建者的 getProduct
方法获取构建好的产品,并调用产品的描述方法。
这个示例将对象的构建过程与表示分离,提供了一种灵活且可读性强的方式来构建复杂对象。
.post-copyright { box-shadow: 2px 2px 5px; line-height: 2; position: relative; margin: 40px 0 10px; padding: 10px 16px; border: 1px solid var(--light-grey); transition: box-shadow .3s ease-in-out; overflow: hidden; border-radius: 12px!important; background-color: var(--main-bg-color); } .post-copyright:before { position: absolute; right: -26px; top: -120px; content: '\f25e'; font-size: 200px; font-family: 'FontAwesome'; opacity: .2; } .post-copyright__title { font-size: 22px; } .post-copyright_type { font-size: 18px; color:var(--theme-color) } .post-copyright .post-copyright-info { padding-left: 6px; font-size: 15px; } .post-copyright-m-info .post-copyright-a, .post-copyright-m-info .post-copyright-c, .post-copyright-m-info .post-copyright-u { display: inline-block; width: fit-content; padding: 2px 5px; font-size: 15px; } .muted-3-color { color: var(--main-color); } /*手机优化*/ @media screen and (max-width:800px){.post-copyright-m-info{display:none}} ------本页内容已结束,喜欢请分享------