创建型模式 建造者模式
创建型模式 建造者模式
1) Builder:为创建产品各个部分,统一抽象接口。
2) ConcreteBuilder:具体的创建产品的各个部分,部分A, 部分B,部分C。
3) Director:构造一个使用Builder接口的对象。
4) Product:表示被构造的复杂对象。
ConcreteBuilder创建该产品的内部表示并定义它的装配过程,包含定义组成部件的类,包括将这些部件装配成最终产品的接口。
适用情况:一个对象的构建比较复杂,将一个对象的构建和对象的表示进行分离。
/** * 创建型模式 建造者模式 * Builder模式也叫建造者模式或者生成器模式,是由GoF提出的23种设计模式中的一种。 * Builder模式是一种对象创建型模式之一,用来隐藏复合对象的创建过程,它把复合对象的创建过程加以抽象,通过子类继承和重载的方式,动态地创建具有复合属性的对象。 * 对象的创建:Builder模式是为对象的创建而设计的模式- 创建的是一个复合对象:被创建的对象为一个具有复合属性的复合对象 * 关注对象创建的各部分的创建过程:不同的工厂(这里指builder生成器)对产品属性有不同的创建方法 * */ #include <iostream> #include <string> // 表示被构造的复杂对象 class House { public: void setFloor(std::string floor) { this->m_floor = floor; } void setWall(std::string wall) { this->m_wall = wall; } void setDoor(std::string door) { this->m_door = door; } std::string getFloor() { return m_floor; } std::string getWall() { return m_wall; } std::string getDoor() { return m_door; } private: std::string m_floor; std::string m_wall; std::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 FlatBuild: public Builder { public: FlatBuild() { pHouse = new House; } ~FlatBuild() { delete pHouse; pHouse = nullptr; } virtual void makeFloor() override { pHouse->setFloor("Flat Floor"); } virtual void makeWall() override { pHouse->setWall("Flat Wall"); } virtual void makeDoor() override { pHouse->setDoor("Flat Door"); } virtual House * getHouse() override { return pHouse; } private: House *pHouse; }; // 别墅施工队 class VillBuild: public Builder { public: VillBuild() { pHouse = new House; } ~VillBuild() { delete pHouse; pHouse = nullptr; } virtual void makeFloor() override { pHouse->setFloor("Vill Floor"); } virtual void makeWall() override { pHouse->setWall("Vill Wall"); } virtual void makeDoor() override { pHouse->setDoor("Vill Door"); } virtual House * getHouse() override { return pHouse; } private: House *pHouse; }; // 指挥者按照设计师的要求进行指挥 // 依赖关系,依赖设计师 class Director { public: void doConstruct(Builder * builder) { builder->makeFloor(); builder->makeWall(); builder->makeDoor(); } }; void mytest() { // 客户直接造房子 House * pHouse = new House(); pHouse->setFloor("diy floor"); pHouse->setWall("diy wall"); pHouse->setDoor("diy door"); std::cout << pHouse->getFloor().c_str() << std::endl; std::cout << pHouse->getWall().c_str() << std::endl; std::cout << pHouse->getDoor().c_str() << std::endl; delete pHouse; pHouse = nullptr; // 指挥者按照设计师的要求进行指挥 Director * director = new Director(); Builder * builder = nullptr; builder = new FlatBuild(); director->doConstruct(builder); // 指挥者指挥工程队施工 pHouse = builder->getHouse(); std::cout << pHouse->getFloor().c_str() << std::endl; std::cout << pHouse->getWall().c_str() << std::endl; std::cout << pHouse->getDoor().c_str() << std::endl; delete builder; builder = nullptr; pHouse = nullptr; builder = new VillBuild(); director->doConstruct(builder); // 指挥者指挥工程队施工 pHouse = builder->getHouse(); std::cout << pHouse->getFloor().c_str() << std::endl; std::cout << pHouse->getWall().c_str() << std::endl; std::cout << pHouse->getDoor().c_str() << std::endl; delete builder; builder = nullptr; pHouse = nullptr; delete director; director = nullptr; return; } int main() { mytest(); system("pause"); return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」