创建型 建造者模式

简介: 创建型 建造者模式

建造者模式(Builder Pattern): 多个简单的对象一步一步构建成一个复杂的对象。

如:肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的“套餐”;

建造者模式

提供一种封装,管理各个子对象的创建。

逻辑分析:

目标是同一个产品,可以由不同模块组装而成。

==》所以需要定义一个产品类,以及组装模块提供函数。

不同的模块需要不同的组装构造,就是我们的构建者。(控制产品类不同的构造)

==》需要提供基础类,操作一个产品对象,提供方法对其中的产品对象做不同的模块控制

==》需要提供产品的生成接口。

==》通过子类实现不同模块的不同创建

使用场景:

如盖房子,门的设计,走廊的设计,室内的设计等,分别可以做不同的封装然后组合进行构造。

源码Demo:

#include <string.h>
#include <iostream>
using namespace std;
//造房子 可以模块化构造然后组装 这里我们定义房子的基本属性  ==》目标建筑
class House
{
public:
  void setFloor(string floor){
    this->m_floor = floor;
  }
  void setWall(string wall){
    this->m_wall = wall;
  }
  void setDoor(string door){
    this->m_door = door;
  }
  string getFloor(){
    return m_floor;
  }
  string getWall(){
    return  m_wall; 
  }
  string getDoor(){
    return m_door;
  }
private:
  string   m_floor;
  string   m_wall;
  string   m_door;
};
//用构建者模型来进行管理 不同的模型可以用继承的方式管理
//构造一个产品对象,并设定不同的模块构造接口
class Builder
{
public:
  virtual void makeFloor() = 0;
  virtual void makeWall() = 0;
  virtual void makeDoor() = 0;
  virtual House *GetHouse() = 0;
  virtual ~Builder() {}
};
//不同的子类 实现不同的产品模块定制  ==》建筑师
class VillaBuild : public Builder//别墅
{
public:
  VillaBuild(){
    pHouse = new House;
  }
  ~VillaBuild()
  {
    if(pHouse != nullptr)
    {
      delete pHouse;
      pHouse = nullptr;
    }
  }
  virtual void makeFloor(){
    pHouse->setFloor("villa floor");
  }
  virtual void makeWall(){
    pHouse->setWall("villa Wall");
  }
  virtual void makeDoor(){
    pHouse->setDoor("villa Door");
  }
  virtual House *GetHouse(){
    return pHouse; 
  }
private:
  House *pHouse;
};
class FlatBuild : public Builder//公寓
{
public:
  FlatBuild(){
    pHouse = new House; 
  }
  ~FlatBuild()
  {
    if(pHouse != nullptr)
    {
      delete pHouse;
      pHouse = nullptr;
    }
  }
  virtual void makeFloor(){
    pHouse->setFloor("flat Door");
  }
  virtual void makeWall(){
    pHouse->setWall("flat Wall");
  }
  virtual void makeDoor(){
    pHouse->setDoor("flat Door");
  }
  virtual House *GetHouse(){
    return pHouse;
  }
private:
  House *pHouse;
};
//如果子类过多,产品模型过多,可以用同一个接口对其进行管理  ==》设计者
//通过具体的子类对象  构建不同的建筑类型
class Director
{
public://这里使用的对象注入的功能,将你建造的对象,通过指针传递过来,然后使用指针进行操作
  void Construct(Builder *builder)
  {
    builder->makeFloor();
    builder->makeWall();
    builder->makeDoor();
  }
};
int main()
{
  //设计师提供建筑模板类 可以自己定制不用这个类
  Director * director = new Director();
  //根据需要定制要创建的目标建筑 建筑师创建
  Builder * builder = new VillaBuild();
  //直接通过建筑模板(类似工厂方法进行创建)
  director->Construct(builder);
  //获取建造结果 进行查看
  House * house = builder->GetHouse();
  cout<<"VillaBuild floor:"<<house->getFloor()<<endl;
  cout<<"VillaBuild wall:"<<house->getWall()<<endl;
  cout<<"VillaBuild door:"<<house->getDoor()<<endl;
  if(builder != nullptr)
  {
    delete builder;
    builder = nullptr;
  }
  //创建另一种类型的建筑
  builder = new FlatBuild();
  //通过模板进行构建 ==》设计师
  director->Construct(builder);
  house = builder->GetHouse();
  cout<<"FlatBuild floor:"<<house->getFloor()<<endl;
  cout<<"FlatBuild wall:"<<house->getWall()<<endl;
  cout<<"FlatBuild door:"<<house->getDoor()<<endl;
  if(builder != nullptr)
  {
    delete builder;
    builder = nullptr;
  }
  if(director != nullptr)
  {
    delete director;
    director = nullptr;
  }
  return 0;
}
目录
相关文章
|
关系型数据库 测试技术 Serverless
【PolarDB Serverless】资源伸缩&压测 TPC-C 测评
【PolarDB Serverless】资源伸缩&压测 TPC-C 测评
156266 31
【PolarDB Serverless】资源伸缩&压测 TPC-C 测评
|
人工智能 弹性计算 算法
【Hello AI】AI加速器Deepytorch-面向生成式AI和大模型场景
Deepytorch作为阿里云自研的AI加速器,面向生成式AI和大模型场景,提供了训练和推理加速能力。
【Hello AI】AI加速器Deepytorch-面向生成式AI和大模型场景
|
11月前
|
小程序
uni-app开发微信小程序使用onPullDownRefresh(下拉刷新)总结
uni-app开发微信小程序使用onPullDownRefresh(下拉刷新)总结
1653 0
|
数据库
1NF | 2NF | 3NF的区分以及什么是函数依赖、部分函数依赖、值传递依赖(最详细的讲解1NF、2NF、3NF的关系)
这篇文章详细讲解了数据库范式中的1NF、2NF和3NF,包括它们的定义、区分方法和如何判断部分函数依赖和传递函数依赖,以及如何将数据表规范化到相应的范式。
1NF | 2NF | 3NF的区分以及什么是函数依赖、部分函数依赖、值传递依赖(最详细的讲解1NF、2NF、3NF的关系)
Flutter-自定义折叠流布局实现
Flutter-自定义折叠流布局实现
255 0
|
缓存 安全 Java
Spring Boot与GraphQL的集成最佳实践
Spring Boot与GraphQL的集成最佳实践
|
SQL 监控 搜索推荐
Elasticsearch 与 OpenSearch:开源搜索技术的演进与选择
Elasticsearch 与 OpenSearch:开源搜索技术的演进与选择
|
缓存 监控 Linux
top命令详解
`top`是Linux下的系统监视工具,显示实时的CPU、内存使用及进程详情。交互式界面允许按CPU或内存排序进程,查看进程ID、用户、内存占用等信息。可通过`P`、`M`、`k`、`r`进行操作,如改变进程优先级或退出。使用`man top`获取完整帮助。
402 3
|
前端开发 编译器 Linux
浅谈C++20 协程那点事儿
本文是 C++20 的协程入门文章,作者围绕协程的概念到协程的实现思路全方位进行讲解,努力让本文成为全网最好理解的「C++20 协程」原理解析文章。
|
Shell API Android开发
【Android 应用开发】Android 上实现非root的 Traceroute -- 非Root权限下移植可执行二进制文件 脚本文件(一)
【Android 应用开发】Android 上实现非root的 Traceroute -- 非Root权限下移植可执行二进制文件 脚本文件
719 0