【C++设计模式】建造者模式

简介: 建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。如建房子的过程有打地基、筑墙、安装门窗等,但是可以按照用户的不同需求进行建造不同风格的房子。

一、建造者模式

建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。如建房子的过程有打地基、筑墙、安装门窗等,但是可以按照用户的不同需求进行建造不同风格的房子。

1.1 建造者模式的结构

抽象建造者(AbstractBuilder):创建一个Product对象的各个部件指定的抽象接口;

具体建造者(ConcreteBuilder):实现AbstractBuilder的接口,实现各个部件的具体构造方法和装配方法,并返回创建结果。

产品(Product):具体的产品对象

指挥者(Director): 构建一个使用Builder接口的对象,安排复杂对象的构建过程,客户端一般只需要与Director交互,指定建造者类型,然后通过构造函数或者setter方法将具体建造者对象传入Director。它主要作用是:隔离客户与对象的生产过程,并负责控制产品对象的生产过程。

image.png

1.2 建造者模式的实例

造房子:

image.png

二、代码

2.1 头文件

(1)定义产品类House类,具有florr、wall和root三个属性。

(2)定义2个抽象构造者AbstractBuilder,其构造函数即要new一个House实例对象,然后还有4个建墙、建地板等的纯虚函数。在后面的具体建造者类中重写纯虚函数。

(3)定义指挥者类Director类,这个类最重要也是最有挑战性的。含有抽象建造者对象AbstractBuilder、封装组装流程的House型方法(结果返回建造的结果)、setBuilder方法也是最有意思的(参数是AbstractBuilder *iBuilder,但我们是可以传入子类对象指针的,比如具体建造者A的对象指针,即用了多态)。

#include<string>
using namespace std;
//产品类House
class House{
public:
  //构造函数
  House(){}
  void setFloor(string iFloor){
    this->floor = iFloor;
  }
  void setWall(string iWall){
    this->wall = iWall;
  }
  void setRoof(string iRoof){
    this->roof = iRoof;
  }
  //打印House信息
  void printfHouseInfo(){
    printf("Floor:%s\t\n", this->floor.c_str());
    printf("Wall:%s\t\n", this->wall.c_str());
    printf("Roof:%s\t\n", this->roof.c_str());
  }
private:
  string floor;
  string wall;
  string roof;
};
//抽象建造者AbstractBall
class AbstractBuilder{
public:
  AbstractBuilder(){
    house = new House();
  }
  //抽象方法:
  virtual void buildFloor() = 0;
  virtual void buildWall() = 0;
  virtual void buildRoof() = 0;
  //纯虚函数,在具体建造者中进行
  virtual House *getHouse() = 0;
  //实例化房子类house对象
  House *house;
};
//具体建造者ConcreteBuilderA
class ConcreteBuilderA :public AbstractBuilder{
public:
  ConcreteBuilderA(){
    printf("ConcreteBuilderA\n");
  }
  //具体实现方法
  void buildFloor(){
    this->house->setFloor("Floor_A");
  }
  void buildWall(){
    this->house->setWall("Wall_A");
  }
  void buildRoof(){
    this->house->setRoof("Roof_A");
  }
  House *getHouse(){
    return this->house;
  }
};
//具体建造者ConcreteBuilderB
class ConcreteBuilderB :public AbstractBuilder{
public:
  ConcreteBuilderB(){
    printf("ConcreteBuilderB\n");
  }
  //具体实现方法
  void buildFloor(){
    this->house->setFloor("Floor_B");
  }
  void buildWall(){
    this->house->setWall("Wall_B");
  }
  void buildRoof(){
    this->house->setRoof("Roof_B");
  }
  House *getHouse(){
    return this->house;
  }
};
//指挥者Director
class Director{
public:
  Director(){}
  //具体实现方法
  void setBuilder(AbstractBuilder *iBuilder){
    this->builder = iBuilder;
  }
    //封装组装流程,返回建造结果
  House *construct(){
    builder->buildFloor();
    builder->buildWall();
    builder->buildRoof();
    return builder->getHouse();
  }
private:
  AbstractBuilder *builder;
};

2.2 客户端代码

#include "BuilderPattern.h"
int main(){
  //抽象建造者
  AbstractBuilder *builder;
  //指挥者
  Director *director = new Director();
  //产品:House
  House *house;
  //指定具体建造者A
  builder = new ConcreteBuilderA();
  director->setBuilder(builder);
  house = director->construct();
  house->printfHouseInfo();
  //指定具体建造者B
  builder = new ConcreteBuilderB();
  director->setBuilder(builder);
  house = director->construct();
  house->printfHouseInfo();
  system("pause");
  return 0;
}

image.png

在客户端只需要指定具体建造者,并作为参数传递给指挥者,通过指挥者即可得到结果。客户端无需关心House的建造方法和具体流程。

如果需要更换建造风格,只需要更换建造者即可。不同建造者之间木有联系,方便替换。

从代码优化角度来看,其实可以不需要指挥者Director的角色,而直接把construct方法放入具体建造者当中。

相关文章
|
2月前
|
设计模式 算法
设计模式--建造者模式 builder
这篇文章通过一个电脑购买的例子,详细解释了建造者模式的四个角色(产品类、抽象构建者、实体构建类和指导者类),并提供了相应的代码实现,阐述了建造者模式在设计复杂对象时的应用和优势。
设计模式--建造者模式 builder
|
2月前
|
设计模式 算法 Java
Java设计模式-建造者模式(6)
Java设计模式-建造者模式(6)
|
3月前
|
设计模式 XML 存储
【四】设计模式~~~创建型模式~~~建造者模式(Java)
文章详细介绍了建造者模式(Builder Pattern),这是一种创建型设计模式,用于将复杂对象的构建与其表示分离,允许分步骤创建一个复杂的对象而无需指定其内部的具体构造细节。通过定义抽象建造者、具体建造者、指挥者和产品角色,建造者模式允许通过相同的构建过程创建不同的产品表示,提高了系统的灵活性和扩展性。
|
4月前
|
设计模式 C++
C++一分钟之-设计模式:工厂模式与抽象工厂
【7月更文挑战第14天】设计模式是解决软件设计问题的通用方案。工厂模式与抽象工厂模式是创建型模式,用于对象创建而不暴露创建逻辑。工厂模式推迟实例化到子类,但过度使用会增加复杂性。抽象工厂则创建相关对象族,但过度抽象可能造成不必要的复杂度。两者均应按需使用,确保设计灵活性。代码示例展示了C++中如何实现这两种模式。
41 3
|
4月前
|
设计模式 安全 C++
C++一分钟之-C++中的设计模式:单例模式
【7月更文挑战第13天】单例模式确保类只有一个实例,提供全局访问。C++中的实现涉及线程安全和生命周期管理。基础实现使用静态成员,但在多线程环境下可能导致多个实例。为解决此问题,采用双重检查锁定和`std::mutex`保证安全。使用`std::unique_ptr`管理生命周期,防止析构异常和内存泄漏。理解和正确应用单例模式能提升软件的效率与可维护性。
45 2
|
5月前
|
设计模式 算法
建造者模式-大话设计模式
建造者模式-大话设计模式
|
4月前
|
设计模式 JavaScript
js设计模式【详解】—— 建造者模式
js设计模式【详解】—— 建造者模式
44 0
|
6月前
|
设计模式 开发框架 算法
C++中的设计模式:基本概念与应用
C++中的设计模式:基本概念与应用
59 2
|
5月前
|
设计模式
设计模式-05建造者模式(Builder Pattern)
设计模式-05建造者模式(Builder Pattern)
|
5月前
|
设计模式 Java
Java设计模式:建造者模式之经典与流式的三种实现(四)
Java设计模式:建造者模式之经典与流式的三种实现(四)