led照明企业网站模板,微信手机网站建设,百度竞价广告的位置,seo网站自动推广什么是建造者模式#xff1f;
建造者模式是一种创建型设计模式#xff0c;它用于一步步地构建一个复杂对象#xff0c;同时将对象的构建过程与它的表示分离开。简单来说#xff1a;
它将复杂对象的“建造步骤”分成多部分#xff0c;让我们可以灵活地控制这些步骤。通过…什么是建造者模式
建造者模式是一种创建型设计模式它用于一步步地构建一个复杂对象同时将对象的构建过程与它的表示分离开。简单来说
它将复杂对象的“建造步骤”分成多部分让我们可以灵活地控制这些步骤。通过不同的建造者构建过程可以生成不同的产品。 现实中的例子
想象你在快餐店点套餐
每份套餐包括主食、饮料和甜品。套餐1汉堡 可乐 冰淇淋。套餐2三明治 果汁 蛋糕。
虽然套餐的结构相同但具体的内容不同。如果你点套餐时只需告诉服务员你要套餐1或套餐2剩下的流程由服务员来完成。这种“组装”套餐的过程就是建造者模式的一个应用场景。 模式的特点
建造者模式特别适合构建那些
由多个部分组成的复杂对象。构建步骤固定但各部分内容可以变化。需要创建不同类型的对象。 模式结构
建造者模式包含以下几个角色
产品Product 最终构建的复杂对象由多个部分组成。 建造者Builder 定义对象的构建步骤如构建地基、搭建结构等。 具体建造者Concrete Builder 实现具体的构建逻辑构建特定类型的产品。 指挥者Director 控制建造过程调用建造者的步骤按顺序完成构建。 客户端Client 选择具体的建造者通过指挥者完成产品构建并获取最终产品。 用代码实现一个建造者模式
下面我们以建造房子为例展示如何使用建造者模式来完成两种房子的构建木屋 和 玻璃房。
1. 产品类房子
房子是一个复杂对象由地基、结构和屋顶组成。
#include iostream
#include string
#include memory // 用于智能指针管理// 产品类房子
class House {
public:void setFoundation(const std::string foundation) {foundation_ foundation; // 设置地基}void setStructure(const std::string structure) {structure_ structure; // 设置结构}void setRoof(const std::string roof) {roof_ roof; // 设置屋顶}// 显示房子的组成部分void show() const {std::cout 房子地基 foundation_ 结构 structure_ 屋顶 roof_ \n;}private:std::string foundation_; // 地基std::string structure_; // 结构std::string roof_; // 屋顶
};2. 抽象建造者Builder
定义房子的建造步骤包括构建地基、搭建结构和安装屋顶。
// 抽象建造者类
class HouseBuilder {
public:virtual ~HouseBuilder() default;virtual void buildFoundation() 0; // 建造地基virtual void buildStructure() 0; // 建造结构virtual void buildRoof() 0; // 建造屋顶virtual std::shared_ptrHouse getHouse() 0; // 返回建造完成的房子
};3. 具体建造者木屋和玻璃房
分别实现木屋和玻璃房的建造逻辑。
// 木屋建造者
class WoodenHouseBuilder : public HouseBuilder {
public:WoodenHouseBuilder() {house_ std::make_sharedHouse();}void buildFoundation() override {house_-setFoundation(木制地基);}void buildStructure() override {house_-setStructure(木制结构);}void buildRoof() override {house_-setRoof(木制屋顶);}std::shared_ptrHouse getHouse() override {return house_;}private:std::shared_ptrHouse house_;
};// 玻璃房建造者
class GlassHouseBuilder : public HouseBuilder {
public:GlassHouseBuilder() {house_ std::make_sharedHouse();}void buildFoundation() override {house_-setFoundation(玻璃地基);}void buildStructure() override {house_-setStructure(玻璃结构);}void buildRoof() override {house_-setRoof(玻璃屋顶);}std::shared_ptrHouse getHouse() override {return house_;}private:std::shared_ptrHouse house_;
};4. 指挥者类Director
指挥者定义房子的建造流程并调用建造者完成房子。
// 指挥者类
class Director {
public:void setBuilder(std::shared_ptrHouseBuilder builder) {builder_ builder;}// 建造房子的完整流程void constructHouse() {if (builder_) {builder_-buildFoundation();builder_-buildStructure();builder_-buildRoof();}}private:std::shared_ptrHouseBuilder builder_;
};5. 客户端代码
客户端选择建造的房子类型通过指挥者控制建造流程最后获取建好的房子。
int main() {Director director; // 创建指挥者// 构建木屋auto woodenBuilder std::make_sharedWoodenHouseBuilder();director.setBuilder(woodenBuilder);director.constructHouse();woodenBuilder-getHouse()-show(); // 输出木屋信息// 构建玻璃房auto glassBuilder std::make_sharedGlassHouseBuilder();director.setBuilder(glassBuilder);director.constructHouse();glassBuilder-getHouse()-show(); // 输出玻璃房信息return 0;
}运行结果
程序运行后输出如下
房子地基木制地基结构木制结构屋顶木制屋顶
房子地基玻璃地基结构玻璃结构屋顶玻璃屋顶模式的优缺点
优点
分离复杂对象的创建过程与表示 客户端只需关心建造步骤不必关心具体实现。 支持多种产品表示 可以通过不同的建造者创建不同的产品。 易于扩展 新增产品类型时只需实现新的建造者类。
缺点
增加复杂性 为每个产品类型都需要定义建造者代码量可能较多。 不适合简单对象的构建 如果对象的结构简单直接用工厂模式更高效。 适用场景
需要创建复杂对象对象由多个部分组成并且构建步骤固定。希望支持不同的表示同样的构建过程可以生成不同的产品如木屋和玻璃房。 总结
建造者模式通过将产品的建造过程分解为多个步骤并定义好构建的流程使得我们可以灵活地创建不同类型的复杂对象。 它在需要“分步骤创建复杂对象”且“支持多种表示”的场景中非常适用。 本文用构建房子的例子详细展示了建造者模式的实现过程希望你能理解并应用这一设计模式
建造者模式完整程序及详细解释
以下是实现建造者模式的完整程序代码。我们以建造两种房子木屋和玻璃房为例展示如何通过建造者模式分步骤创建复杂对象。 完整代码
#include iostream
#include string
#include memory // 用于智能指针管理// 产品类房子
class House {
public:void setFoundation(const std::string foundation) {foundation_ foundation; // 设置地基}void setStructure(const std::string structure) {structure_ structure; // 设置结构}void setRoof(const std::string roof) {roof_ roof; // 设置屋顶}// 显示房子的组成部分void show() const {std::cout 房子地基 foundation_ 结构 structure_ 屋顶 roof_ \n;}private:std::string foundation_; // 地基std::string structure_; // 结构std::string roof_; // 屋顶
};// 抽象建造者类定义房子建造的步骤
class HouseBuilder {
public:virtual ~HouseBuilder() default;virtual void buildFoundation() 0; // 建造地基virtual void buildStructure() 0; // 建造结构virtual void buildRoof() 0; // 建造屋顶virtual std::shared_ptrHouse getHouse() 0; // 返回建造完成的房子
};// 木屋建造者具体建造者
class WoodenHouseBuilder : public HouseBuilder {
public:WoodenHouseBuilder() {house_ std::make_sharedHouse();}void buildFoundation() override {house_-setFoundation(木制地基);}void buildStructure() override {house_-setStructure(木制结构);}void buildRoof() override {house_-setRoof(木制屋顶);}std::shared_ptrHouse getHouse() override {return house_;}private:std::shared_ptrHouse house_;
};// 玻璃房建造者具体建造者
class GlassHouseBuilder : public HouseBuilder {
public:GlassHouseBuilder() {house_ std::make_sharedHouse();}void buildFoundation() override {house_-setFoundation(玻璃地基);}void buildStructure() override {house_-setStructure(玻璃结构);}void buildRoof() override {house_-setRoof(玻璃屋顶);}std::shared_ptrHouse getHouse() override {return house_;}private:std::shared_ptrHouse house_;
};// 指挥者类负责控制建造流程
class Director {
public:void setBuilder(std::shared_ptrHouseBuilder builder) {builder_ builder;}// 按照固定的步骤建造房子void constructHouse() {if (builder_) {builder_-buildFoundation(); // 建造地基builder_-buildStructure(); // 建造结构builder_-buildRoof(); // 建造屋顶}}private:std::shared_ptrHouseBuilder builder_;
};// 主函数客户端代码
int main() {Director director; // 创建指挥者// 使用木屋建造者建造房子auto woodenBuilder std::make_sharedWoodenHouseBuilder();director.setBuilder(woodenBuilder);director.constructHouse(); // 按步骤建造木屋woodenBuilder-getHouse()-show(); // 显示木屋信息// 使用玻璃房建造者建造房子auto glassBuilder std::make_sharedGlassHouseBuilder();director.setBuilder(glassBuilder);director.constructHouse(); // 按步骤建造玻璃房glassBuilder-getHouse()-show(); // 显示玻璃房信息return 0;
}运行结果
程序运行后将输出如下内容
房子地基木制地基结构木制结构屋顶木制屋顶
房子地基玻璃地基结构玻璃结构屋顶玻璃屋顶本文由mdnice多平台发布