[学习][笔记]设计模式(基于C/C++实现)<十>建造者模式

简介: 设计模式(基于C/C++实现)<十>建造者模式

文章目录


参考


建造者模式



BuilderPattern


定义


使用场景


一步步构建的建造过程


基本思路


1.设计指挥者,来调用实际建造者 建造

2.设计产品的组成和组成顺序

3.抽象建造者,规定建造顺序和成分。

4.具体建造者,不同成分的搭配,最后生产不一样的产品。


• 抽象建造者角色(Builder): 为创建一个Product对象的各个部件指定抽象接口,以规范产品对象的各个组成成分的建造。一般而言,此角色规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。

• 具体建造者(ConcreteBuilder)


1)实现Builder的接口以构造和装配该产品的各个部件。即实现抽象建造者角色Builder的方法。


2)定义并明确它所创建的表示,即针对不同的商业逻辑,具体化复杂对象的各部分的创建


   提供一个检索产品的接口


   构造一个使用Builder接口的对象即在指导者的调用下创建产品实例


指导者(Director): 调用具体建造者角色以创建产品对象的各个部分。指导者并没有涉及具体产品类的信息,真正拥有具体产品的信息是具体建造者对象。它只负责保证对象各部分完整创建或按某种顺序创建。


产品角色(Product): 建造中的复杂对象。它要包含那些定义组件的类,包括将这些组件装配成产品的接口。


实例


麦当劳,前台收银员(director)点餐-》指挥后厨(builder)做套餐(product)-》交由前台收银员(director)给顾客

//director.h 收银员
#ifndef DIRECTOR_H
#define DIRECTOR_H
#include "builder.h"
class Product;
class Builder;
class Director
{
private:
    Builder *builderPtr;
public:
    Director(Builder *builder){
        builderPtr = builder;
    }
    void Build(){
        builderPtr->BuildPartA();
        builderPtr->BuildPartB();
    }
    Product* GetResult(){
        return builderPtr->GetProduct();
    }
};
#endif // DIRECTOR_H
//builder.h 后厨们
#ifndef BUILDER_H
#define BUILDER_H
#include "product.h"
class Builder
{
public:
    virtual void BuildPartA(){}
    virtual void BuildPartB(){}
    virtual Product* GetProduct(){return nullptr;};
};
#endif // BUILDER_H
//builder_concrete.h 小食品+汉堡套餐 搭配的后厨
#ifndef BUILDER_CONCRETE_H
#define BUILDER_CONCRETE_H
#include "product.h"
#include "builder.h"
class ConcreteBuilder:public Builder
{
private:
    Product * productPtr = new Product;
public:
    void BuildPartA() override{
        productPtr->Add("A","薯条");
    }
    void BuildPartB() override{
        productPtr->Add("B","汉堡");
    }
    Product * GetProduct() override{
        return productPtr;
    }
};
#endif // BUILDER_CONCRETE_H
//套餐抽象
#ifndef PRODUCT_H
#define PRODUCT_H
#include <map>
#include <string>
class Product{
public:
    std::map<std::string,std::string> itemList;
    void Add(std::string itemIndex,std::string itemContent){
        itemList[itemIndex] = itemContent;
    }
};
#endif // PRODUCT_H
//client点餐
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include "product.h"
#include "director.h"
#include "builder_concrete.h"
int main()
{
    std::cout<<"start build"<<std::endl;
    Builder *builderPtr = new ConcreteBuilder();
    Director* directorPtr = new Director(builderPtr);
    directorPtr->Build();
    Product* productPtr = directorPtr->GetResult();
    if(productPtr->itemList.find("A") != productPtr->itemList.end()){
        std::cout<< "product partA:"<< productPtr->itemList["A"].c_str() << std::endl;
    }
    if(productPtr->itemList.find("B") != productPtr->itemList.end()){
        std::cout << "product partB:"<< productPtr->itemList["B"].c_str() << std::endl;
    }
    std::cout<<"end build"<<std::endl;
    return 0;
}
输出结果:
start build
product partA:薯条
product partB:汉堡
end build

总结

demo地址

建造者模式与工厂模式类似,他们都是建造者模式,适用的场景也很相似。一般来说,如果产品的建造很复杂,那么请用工厂模式;如果产品的建造更复杂,那么请用建造者模式。

相关文章
|
2月前
|
设计模式 算法
设计模式--建造者模式 builder
这篇文章通过一个电脑购买的例子,详细解释了建造者模式的四个角色(产品类、抽象构建者、实体构建类和指导者类),并提供了相应的代码实现,阐述了建造者模式在设计复杂对象时的应用和优势。
设计模式--建造者模式 builder
|
3月前
|
算法 C语言 C++
C++语言学习指南:从新手到高手,一文带你领略系统编程的巅峰技艺!
【8月更文挑战第22天】C++由Bjarne Stroustrup于1985年创立,凭借卓越性能与灵活性,在系统编程、游戏开发等领域占据重要地位。它继承了C语言的高效性,并引入面向对象编程,使代码更模块化易管理。C++支持基本语法如变量声明与控制结构;通过`iostream`库实现输入输出;利用类与对象实现面向对象编程;提供模板增强代码复用性;具备异常处理机制确保程序健壮性;C++11引入现代化特性简化编程;标准模板库(STL)支持高效编程;多线程支持利用多核优势。虽然学习曲线陡峭,但掌握后可开启高性能编程大门。随着新标准如C++20的发展,C++持续演进,提供更多开发可能性。
71 0
|
3月前
|
C++
c++学习笔记07 结构体
C++结构体的详细学习笔记07,涵盖了结构体的定义、使用、数组、指针、嵌套、与函数的交互以及在结构体中使用const的示例和解释。
37 0
|
6天前
|
编译器 C语言 C++
配置C++的学习环境
【10月更文挑战第18天】如果想要学习C++语言,那就需要配置必要的环境和相关的软件,才可以帮助自己更好的掌握语法知识。 一、本地环境设置 如果您想要设置 C++ 语言环境,您需要确保电脑上有以下两款可用的软件,文本编辑器和 C++ 编译器。 二、文本编辑器 通过编辑器创建的文件通常称为源文件,源文件包含程序源代码。 C++ 程序的源文件通常使用扩展名 .cpp、.cp 或 .c。 在开始编程之前,请确保您有一个文本编辑器,且有足够的经验来编写一个计算机程序,然后把它保存在一个文件中,编译并执行它。 Visual Studio Code:虽然它是一个通用的文本编辑器,但它有很多插
29 6
|
26天前
|
Java 编译器 C++
c++学习,和友元函数
本文讨论了C++中的友元函数、继承规则、运算符重载以及内存管理的重要性,并提到了指针在C++中的强大功能和使用时需要注意的问题。
16 1
|
2月前
|
设计模式 算法 Java
Java设计模式-建造者模式(6)
Java设计模式-建造者模式(6)
|
2月前
|
安全 C语言 C++
C++学习笔记
C++学习笔记
|
3月前
|
C++ 容器
【C/C++笔记】迭代器
【C/C++笔记】迭代器
23 1
|
3月前
|
C++
【学习笔记】【C/C++】 c++字面值常量
【学习笔记】【C/C++】 c++字面值常量
32 1
|
3月前
|
存储 安全 程序员
【C/C++笔记】迭代器范围
【C/C++笔记】迭代器范围
63 0