不得不的创建型模式-建造者模式

建造者模式是一种创建型设计模式,它将复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。模式包括产品类、抽象建造者、具体建造者和指挥者四个角色。通过一个简单的C++代码示例展示了如何使用建造者模式,并列举了面试中可能遇到的问题及其答案。
摘要由CSDN通过智能技术生成

目录

 建造者模式是什么

下面是一个简单的示例代码,演示了如何使用建造者模式来构建一个复杂对象:

面试中可能遇到的问题及回答:


 建造者模式是什么

建造者模式是一种创建型模式,它的目的是将复杂对象的构造过程分离成多个简单的步骤,以便于对象的构建与表示分离。它允许你通过一系列简单的步骤来创建一个复杂的对象,而无需了解该对象的内部构造细节。

底层原理: 建造者模式包括四个角色:产品类、抽象建造者、具体建造者和指挥者。其中,产品类表示被建造的复杂对象,抽象建造者定义了构建该对象所需的所有步骤和方法,具体建造者实现这些方法来构建对象,而指挥者负责协调和控制这些步骤的顺序和过程。

实际应用: 建造者模式通常适用于以下情况:

  1. 需要创建复杂的对象,这些对象包含多个部分,每个部分需要按照特定的顺序构建。
  2. 需要建造者模式是一种创建型模式,它的主要目的是将复杂对象的构造过程分离成多个简单的步骤,以便于对象的构建与表示分离。它允许您通过一系列简单的步骤来创建一个复杂的对象,而无需了解该对象的内部构造细节。

    底层原理: 建造者模式包括四个核心角色:产品类、抽象建造者、具体建造者和指挥者。其中,产品类表示被建造的复杂对象,抽象建造者定义了构建该对象所需的所有步骤和方法,具体建造者实现这些方法来构建对象,而指挥者负责协调和控制这些步骤的顺序和过程。

下面是一个简单的示例代码,演示了如何使用建造者模式来构建一个复杂对象:

#include <iostream>
#include <string>

using namespace std;

// 产品类
class Product {
public:
    void SetPartA(const string& partA) { partA_ = partA; }
    void SetPartB(const string& partB) { partB_ = partB; }
    void SetPartC(const string& partC) { partC_ = partC; }
    void Show() const {
        cout << "PartA: " << partA_ << endl;
        cout << "PartB: " << partB_ << endl;
        cout << "PartC: " << partC_ << endl;
    }

private:
    string partA_;
    string partB_;
    string partC_;
};

// 抽象建造者
class Builder {
public:
    virtual void BuildPartA() = 0;
    virtual void BuildPartB() = 0;
    virtual void BuildPartC() = 0;
    virtual Product GetProduct() = 0;
};

// 具体建造者
class ConcreteBuilder : public Builder {
public:
    void BuildPartA() override { product_.SetPartA("PartA"); }
    void BuildPartB() override { product_.SetPartB("PartB"); }
    void BuildPartC() override { product_.SetPartC("PartC"); }
    Product GetProduct() override { return product_; }

private:
    Product product_;
};

// 指挥者
class Director {
public:
    void Construct(Builder* builder) {
        builder->BuildPartA();
builder->BuildPartB();
builder->BuildPartC();
}
};

// 客户端代码
int main() {
Director director;
ConcreteBuilder builder;
director.Construct(&builder);
Product product = builder.GetProduct();
product.Show();
return 0;

 


在上面的示例中,`Product` 表示被构建的复杂对象,`Builder` 表示抽象建造者,定义了构建对象所需的所有步骤和方法。`ConcreteBuilder` 表示具体建造者,实现了这些方法来构建对象。`Director` 表示指挥者,负责协调和控制建造过程的顺序和过程。

在客户端代码中,首先创建了一个指挥者对象和一个具体建造者对象,然后将具体建造者对象传递给指挥者对象,并调用 `Construct` 方法来控制对象的构建过程。最后,通过调用具体建造者对象的 `GetProduct` 方法来获取构建完成的产品对象,并调用 `Show` 方法来展示该对象的属性。

面试中可能遇到的问题及回答:

问题1:什么是建造者模式?

答案1:建造者模式是一种创建型模式,它允许您分步骤地构建复杂对象。它将对象的构建过程分离成一系列相互独立的步骤,每个步骤由一个建造者对象负责完成。

问题2:建造者模式的主要组成部分有哪些?

答案2:建造者模式的主要组成部分有四个:产品类、抽象建造者类、具体建造者类和指挥者类。

  • 产品类:表示被构建的复杂对象,包含多个部件。
  • 抽象建造者类:定义了构建对象所需的所有步骤和方法,由具体建造者类来实现这些方法。
  • 具体建造者类:实现抽象建造者类中定义的方法,用于构建产品对象的各个部件。
  • 指挥者类:负责协调和控制建造过程的顺序和过程。

问题3:建造者模式有哪些优缺点?

答案3:

优点:

  • 可以封装对象的构建过程,使代码更加灵活、易于维护和扩展。
  • 可以分步骤地构建复杂对象,使得构建过程更加清晰、可控。
  • 可以隔离复杂对象的创建和使用,使得代码更加简洁、易于理解。

缺点:

  • 需要定义很多类,增加了代码量和复杂度。
  • 建造者模式在构建对象时,需要先创建建造者对象并将其传递给指挥者对象,可能会增加代码的复杂度。

问题4:建造者模式和工厂模式有什么区别?

答案4:建造者模式和工厂模式都是创建型模式,但是它们的目的和使用场景不同。工厂模式是用来创建一类产品,而建造者模式则是用来构建复杂对象。工厂模式只关心如何创建对象,而建造者模式关心如何分步骤地构建对象。另外,工厂模式通常只有一个工厂类,而建造者模式需要多个类来协作完成对象的构建。

问题5:建造者模式可以应用在哪些场景?

答案5:建造者模式适用于以下场景:

  • 构建复杂对象:当一个对象需要由多个部分组成,且这些部分的构建顺序和构建方式不固定时,可以使用建造者模式来构建对象。
  • 构建过程需要控制:当对象的构建过程需要进行一些特殊的控制和处理时,可以使用建造者模式来封装构建过程。
  • 需要创建不同表示的对象:当需要创建不同表示的对象时,可以使用建造者模式来封装创建过程,以便于创建不同表示的对象。

问题6:建造者模式和装饰者模式有什么区别?

答案6:建造者模式和装饰者模式都是对象组合的模式,但是它们的目的和使用场景不同。建造者模式是用来构建复杂对象,强调对象的组合方式;而装饰者模式则是用来动态地给对象添加新的行为和责任,强调对象的功能增强。此外,建造者模式通常只需要一个具体建造者类来构建对象,而装饰者模式可能需要多个具体装饰者类来添加不同的行为。

总之,建造者模式可以帮助您封装对象的构建过程,从而使得代码更加灵活,易于维护和扩展。
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五百五。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值