设计模式——建造者模式(生成器模式)总结

生成器模式详解:用法与示例 生成器模式是一种创建型设计模式,允许你分步骤构建复杂对象。 阅读详情

当我们需要创建一个非常复杂的对象时,可以使用建造者模式,分步骤建造一个对象,最后将完整的对象返回给客户端。

比如,我们要生成一个房子对象,建造一个房子,需要打地基、盖围墙、盖地板、安装门、安装窗户,有的房子还要盖车库,有的房子还要盖花园,有的房子要盖游泳池,有的。。。总之,房子是个很复杂的对象,涉及上百种不同的配置。

如果我们直接用房子类来创建房子对象,则需要输入几百参数:地基参数、围墙参数、地板参数、门参数、窗户参数,车库参数、花园参数、泳池参数。。等等几百个参数。

参数众多是一个问题,还有一个问题是,可能绝大多数房子用其中一小部分参数就可以了,其他大部分参数则都是压根用不到的,比如有的房子它不要车库,不要花园,不要泳池,那我们如果直接使用房子类来创建房子对象,这么多参数不就是多此一举了吗?

此时,则适宜使用建造者模式。建造者模式中的关键角色是建造者,建造者就像我们现实世界中的工程队一样,它拥有打地基、盖围墙、盖地板等等所有盖房子的众多方法,而我们用户端,则根据我们客户的需要,仅调用我们需要的方法即可。

更进一步,我们可以引入一个建造者主管的角色,建造者主管能够记住我们客户经常调用的建造者技能,比如建造市面上常用的三室一厅的房子,以前我们客户每需要一个三室一厅的房子,需要告诉建造者应该先打地基,再盖地板,再。。。,现在有了建造者主管这个角色,我们客户只需要告诉建造者主管,我需要一个三室一厅的房子就可以了,主管会安排建造者如果使用建造的方法。

建造者模式基本的逻辑就这么多了,这里需要补充两个容易遗漏的点:1,建造者需要有交付房子的方法,这样才能给客户端返回客户需要的房子。2,建造者需要有reset的方法,这样下一个客户调用建造者盖房子时,建造者就会从头开始盖,而不是在上一个房子的基础上继续盖。

实现代码如下:

"""
我们来思考如何创建一个 房屋House对象。 建造一栋简单的房屋, 首先你需要建造四面墙和地板, 安装房门和一套窗户, 然后再建造一个屋顶。
但是如果你想要一栋更宽敞更明亮的房屋, 还要有院子和其他设施 (例如暖气、 排水和供电设备), 那又该怎么办呢?
"""
from abc import ABC,abstractmethod

# 建造者父类
class Builder(ABC):
    def __init__(self):
        self.house = House()
    @abstractmethod
    def build_base(self,number):
        pass
    @abstractmethod
    def build_wall(self,number):
        pass
    @abstractmethod
    def build_roof(self,number):
        pass
    @abstractmethod
    def build_door(self,number):
        pass
    @abstractmethod
    def build_window(self,number):
        pass
    @abstractmethod
    def build_garage(self,number):
        pass
    @abstractmethod
    def build_swimming_pool(self,number):
        pass
    @abstractmethod
    def build_garden(self,number):
        pass
    @abstractmethod
    def deliver_house(self):
        pass

    def reset(self):
        self.house.parts.clear()


class House:
    def __init__(self):
        self.parts = []
    def add(self,facilities):
        self.parts.append(facilities)
    def show(self):
        return f'This house has {','.join(self.parts)}'

# 这是一个建造廉价房子的建造者,他会使用廉价的材料盖房子
class CheapBuilder(Builder):

    def __init__(self):
        super().__init__()

    def build_base(self,number):
        self.house.add(f'{number} cheap bases')


    def build_wall(self,number):
        self.house.add(f'{number} cheap walls')

    def build_roof(self,number):
        self.house.add(f'{number} cheap roofs')

    def build_door(self,number):
        self.house.add(f'{number} cheap doors')

    def build_window(self,number):
        self.house.add(f'{number} cheap windows')

    def build_garage(self,number):
        self.house.add(f'{number} cheap garages')

    def build_swimming_pool(self,number):
        self.house.add(f'{number} cheap swimming pools')

    def build_garden(self,number):
        self.house.add(f'{number} cheap gardens')

    def deliver_house(self):
        return self.house.show()

# 这是一个建造中等质量房子的建造者
class MiddleBuilder(Builder):
    def __init__(self):
        super().__init__()

    def build_base(self, number):
        pass

    def build_wall(self, number):
        pass

    def build_roof(self, number):
        pass

    def build_door(self, number):
        pass

    def build_window(self, number):
        pass

    def build_garage(self, number):
        pass

    def build_swimming_pool(self, number):
        pass

    def build_garden(self, number):
        pass

    def deliver_house(self):
        pass


# 这是一个建造高档房子的建造者
class UpscaleBuilder(Builder):
    def __init__(self):
        super().__init__()

    def build_base(self, number):
        pass

    def build_wall(self, number):
        pass

    def build_roof(self, number):
        pass

    def build_door(self, number):
        pass

    def build_window(self, number):
        pass

    def build_garage(self, number):
        pass

    def build_swimming_pool(self, number):
        pass

    def build_garden(self, number):
        pass

    def deliver_house(self):
        pass

# 这是建造者主管
class Director:
    # 这是主管记住的建造基本房子的方案
    def build_basic_house(self,builder):
        builder.build_base(1)
        builder.build_roof(1)
        builder.build_wall(4)
        builder.build_window(1)
        builder.build_door(1)

    # 这是主管记住的建造最流行的房子的方案
    def build_popular_house(self,builder):
        builder.build_base(1)
        builder.build_roof(1)
        builder.build_wall(4)
        builder.build_window(2)
        builder.build_door(1)
        builder.build_garage(1)

class Client:
    def __init__(self,builder):
        self.director = Director()
        self.builder = builder

    def buy_basic_house(self):
        self.director.build_basic_house(self.builder)

    def get_house(self):
        return self.builder.deliver_house()

if __name__ == "__main__":
    client = Client(CheapBuilder())
    client.buy_basic_house()
    print(client.get_house())

以下是运行结果:
在这里插入图片描述

eVTOL热管理:从电动车到飞行器的技术跃迁与工程挑战 热管理系统是保障各类电动设备安全、高效运行的核心技术,其基本原理是通过冷却、加热和温度控制,确保电池、电机等关键部件在最佳工况下工作。在新能源汽车领域,热管理技术已相对成熟,但面对eVTOL(电动垂直起降飞行器)这一新兴领域,其设计逻辑需从二维地面转向三维空域,应对环境温度剧烈变化、重量约束极端严苛等全新挑战。eVTOL的热管理不仅是简单的技术移植,更涉及对电池瞬时高功率散热、乘员舱快速温控及多热源耦合等复杂工程问题的系统性解决,直接关系到飞行安全与商业航程。本文聚焦于**环境温度**和**有效载荷**等关 阅读详情

相关推荐

深度解析快递柜管理系统的C++实现:设计与实现

本文详细介绍了一个基于C++的快递柜管理系统的设计与实现,包括系统需求分析、架构设计、数据库设计、关键功能模块实现和测试与验证。通过详细的代码示例和理论分析,读者可以全面了解如何开发一个完整的快递柜管理系统。希望本文能够为读者在实际项目开发中提供有价值的参考。

m0_57781768的博客 713

生成器模式

生成器模式是一种创建型设计模式, 使你能够分步骤创建复杂对象。 该模式允许你使用相同的创建代码生成不同类型和形式的对象。

Hellovie's Blog 1157

Verilog实战:手把手教你实现IEEE 754单精度浮点乘法器(附完整代码)

本文详细介绍了如何使用Verilog实现IEEE 754单精度浮点乘法器,包括标准解析、架构设计、Verilog代码实现及优化技巧。通过两级流水线设计,平衡性能与面积,适用于数字信号处理、AI加速器等高性能计算场景。

weixin_33724046的博客 314

生成器设计模式(Builder Design Pattern)[论点:概念、图示、示例、框架中的应用、场景]

生成器模式通过将对象的构建过程与其表示分离,使得相同的构建过程可以创建不同的表示。例如,假设有一个Report类,它需要根据不同的数据源(如CSV文件、数据库等)以及不同的格式(如HTML、PDF等)生成报告。在这种情况下,可以创建多个生成器,每个生成器负责从特定的数据源中读取数据并生成特定格式的报告。在这种情况下,我们可以使用一个汽车生成者,并通过提供不同的颜色、轮胎类型和发动机类型来创建具有不同属性的汽车。当一个复杂对象的变化仅仅是属性值的变化,而不涉及到整体结构的变化时,只需要一个生成者。

龙飞的博客 2773

学习Fidder主要掌握的技术——流量篡改

本文介绍了Fiddler工具的三种常用调试方法:1)本地映射-通过保存修改JSON响应文件实现接口数据模拟;2)Composer接口调试-通过修改请求参数快速测试接口异常处理;3)断点调试-在请求/响应过程中拦截并修改数据。这三种方法分别适用于前端开发、接口测试和健壮性验证等场景,能够有效提高调试效率。操作步骤包括保存响应、修改数据、配置规则等关键环节,并提供了详细的界面操作指引。

2301_79022773的博客 353

UE4/5编译报错MSB3073终极解决指南:从路径检查到MSVC版本降级

本文针对UE4/5开发中常见的MSB3073编译报错,提供了一套从根源到实战的终极解决指南。文章系统性地讲解了错误成因,并分层次指导排查路径字符、环境变量、MSVC版本兼容性、权限冲突等核心问题,重点介绍了通过降级MSVC编译器版本等关键操作来彻底解决此编译难题。

rl6adventurer的博客 1434

设计模式-生成器模式 builder_pattern

生成器模式通过引入一个指挥者(Director)对象来控制构建过程,一个产品(Product)接口表示要构建的复杂对象,以及一个或多个具体的构建者(Builder)类来实现构建过程。这样,你可以在不改变构建过程的情况下,通过改变构建者的具体实现来创建不同的产品。是指挥者,负责调用构建者的方法来构建产品。这样,如果需要添加新的产品类型,只需要添加相应的具体构建者即可,不需要修改现有代码。这个对象的构建过程涉及多个步骤,并且希望将构建过程与表示对象本身分离,使得相同的构建过程能够创建出不同的表示。

wesigj的博客 2767

课程1:认识Asp.net Core Web API

本文是《.Net Core从零学习搭建权限管理系统》教程专栏的导航站(点击链接,跳转到专栏主页,欢迎订阅,持续更新…)专栏介绍:以实战为线索,基于.Net 7 + REST + Vue、前后端分离,不依赖任何第三方框架,从零一步一步讲解权限管理系统搭建。专栏适用于人群:Web后端开发人员Web API是一个很广泛的概念,Asp.net Core Web API是.NET框架用于创建RESTful风格的项目、用于轻松构建可供多个客户端访问的HTTP服务。1、支持RestFul风格编程;

成长的足迹 1256

生成器模式(Builder)

生成器是一种创建型设计模式,使你能够分步骤创建复杂对象。该模式允许你使用相同的创建 代码生成不同类型和形式的对象。假设有这样一个复杂对象,在对其进行构造时需要对诸多成员变量和嵌套对象进行繁复的初始化工作。这些初始化代码通常深藏于一个包含众多参数且让人基本看不懂的构造函数中;甚至还有更糟糕的情况,那就是这些代码散落在客户端代码的多个位置。如果为每种可能的对象都创建一个子类,这可能导致程序过于复杂:例如, 我们来思考如何创建一个房屋(House)对象。建造一栋简单的房屋,首先你需要建造四面墙和地板。

qq_44632658的博客 851

揭秘AI人工智能中Stable Diffusion的模型微调技巧

Stable Diffusion作为一种强大的文本到图像生成模型,在艺术创作、设计、娱乐等多个领域展现出了巨大的应用潜力。然而,其默认的模型输出可能无法满足特定用户或特定场景的个性化需求。本文章的目的在于深入揭秘Stable Diffusion的模型微调技巧,让读者能够根据自己的需求对模型进行定制化调整,生成符合特定风格、主题或要求的图像。范围涵盖了从基础概念到实际操作,从理论原理到项目实战的全方位内容,旨在为读者提供一个系统且深入的学习指南。

大模型应用工坊 948

泛微系统流程表单获取节点操作者

泛微系统流程表单获取节点操作者 select typename 流程类型, workflowname 流程名称, nodename 节点名称, (case when nodetype=0 then '创建' when nodetype=1 then '审批' when nodetype=2 then '提交' when nodetype=3 then '归档' else '' end) as 节点类型, groupname 节点操作组, (case when type=1 then '部门+安

烧硬盘 4613

【编程素质】设计模式—建造者模式(Builder Design Pattern,生成器模式,Builder Pattern)

1,概念 封装一个产品的构造过程并允许按步骤构造(有多个步骤,工厂模式只有一个步骤,所以两者不同),并可以改变过程。 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 2,场景 相同的方法,不同的执行顺序,产生不同的事件结果时; 多个部件或零件,都可以装配到一个对象中,但是产生的运行结果又不相同时; 产品类非常复杂,或者产品类中的调用顺序不同产生了不同的效能,这个时候使用建造者模式非常合适; 3,类图 4,优缺点 1)优点 良好的封装性, 使用建造者模式可以使客户端不必知道产品内部

午后阳光 344

RK3588上使用PCIE接口的国产千兆网卡YT6801

YT6801是裕太微电子开发的一款国产千兆PCIE以太网控制器芯片,可作为RK3588的PCIE外扩网口使用。

荻夜的博客 8212

设计模式基础概念(创建型模式):生成器模式/建造者模式(Builder Pattern)

建造者模式(Builder)是一种创建型设计模式, 使你能够分步骤创建复杂对象。该模式允许你。

учёба 1102

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

深入理解设计模式-建造者模式(生成器模式)

文章目录一、什么是建造者模式二、使用场景三、简单建造者模式四、传统建造者模式结尾 一、什么是建造者模式 建造者模式也称为生成器模式(英文:Builder Pattern),他可以将复杂对象的建造过程抽象出来,使这个抽象过程的不同实现方法可以构造出不同表现的对象。 二、使用场景 当一个类的构造函数参数个数超过4个,而且这些参数有些是可选的参数,考虑使用构造者模式。 当一个类的构造函数参数超过4个,而且这些参数有些是可选的时,我们通常有两种办法来构建它的对象。 例如我们现在有如下一个类计算机类Compute

少说,多做 1万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

五,设计模式-生成器/建造者模式

摘要:生成器模式(建造者模式)是一种分步骤创建复杂对象的设计模式,允许通过相同构建过程生成不同形式的对象。其核心在于将构建过程从产品类中解耦,通过定义生成器接口、具体生成器类和主管类(Director)来标准化构建流程。与工厂模式不同,它专注于处理复杂对象的构造过程。示例代码展示了如何用C++实现房屋建造过程,包括抽象生成器、具体生成器(木屋/石屋)和主管类,客户端通过主管类调用生成器完成构建,最终输出不同房屋的构造结果。

hai_qin的博客 449

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

设计模式——生成器模式(建造者模式)

学习不是一朝一夕,现在才刚刚开始,共勉。

bilibiliccc的博客 1589

java设计模式---生成器模式(Builder pattern)

java设计模式—生成器模式(Builder pattern) 简介 1.1 定义 工厂类模式提供的是创建单个类的模式,而建造者模式则是将各种产品集中起来进行管理,用来创建复合对象,所谓复合对象就是指某个类具有不同的属性。 与抽象工厂的区别: 在建造者模式里,有个指导者,由指导者来管理建造者,用户是与指导者联系的,指导者联系建造者最后得到产品。即建造模式可以强制实行一种分步骤进行的建造...

渔潭的博客 467

design pattern Builder 生成器设计模式

其实设计模式可以学习很有趣,你并不需要有这么难啃旱地FOG对我来说,当然,这些都是健康的骨骼啃啃。 在本文中,建造者模式设计一个搞笑的一幕。根据这一模型来学习功夫的方法,哈哈。 基类的第一,设计。那么你必须有学习武术基础: class 功夫 { public: virtual void 看招() = 0; }; 有了基础之后。我们就能够学习高级功法了,这里学习降龙十八掌。...

weixin_34018202的博客 146

【Java设计模式】用盖房子案例讲解建造者模式(生成器模式)

现在我们需要建房子,过程为打桩、砌墙、封顶。房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的。请编写程序,完成需求建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。建造者模式是一步一步创建一个复杂的对象,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节。

jcc4261的博客 1030

设计模式学习——建造者模式(Builder Pattern)/生成器模式

// 产品(Product)角色 // 首先是房子类,主要是需要描述一下房屋属性 public classRoom{ private Stringwindow; private Stringfloor; } // 建造者(Builder)角色 // 工人接口,定义了各个工人所要进行的工作。负责进行具体部件如窗户,地板的建造。

古语云 578

java设计模式之建造者模式(生成器模式)最好的例子。

java设计模式之建造者模式(生成器模式)最好的例子。 就是java的 StringBuffer和StringBuilder类 当对字符串进行修改的时候,需要使用StringBuffer和StringBuilder类。 和String类不同的是,StringBuffer和StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象。 Strin

看不过的黑工坊 4447

C++11 设计模式6. 建造者模式,也叫做生成器模式

建造者模式(也被成为⽣成器模式),是⼀种创建型设计模式,软件开发过程中有的时候需要创建很复杂的对象,⽽建造者模式的主要思想是将对象的构建过程分为多个步骤,并为每个步骤定义⼀个抽象的接⼝。,构建过程相对复杂,⽽我们使⽤建造者模式将计算机的构建过程封装在⼀个具体的建造者类中,⽽指导者类则负责指导构建的步骤和顺序。每个具体的建造者类可以负责构建不同型号或配置的计算机,客户端代码可以通过选择不同的建造者来创建不同类型的计算机,这样就可以根据需要构建不同表示的复杂对象,更加灵活。

hunandede的博客 1057

设计模式——建造者模式(生成器模式)

而ConcreteBuilder是具体的建造者,实现Builder接口,构造和装配各个部件,Product是具体的产品。当我们需要创建一些复杂的对象,这些对象内部构建间的顺序通常是稳定的,但是对象内部的构建通常面临着复杂的变化。用了建造者模式,那么用户就只需要指定需要构建的类型就可以得到它们,而具体构造的细节和过程不需要知道。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示的意图。概括地说,Builder是为创建一个Product对象的各个部件指定的抽象接口。

weixin_42903300的博客 989

设计模式之建造者模式/生成器模式

建造者模式/生成器模式 菜鸟教程 - 建造者模式 五分钟设计模式 - 16生成器模式 尚硅谷 1. 介绍 1.1 功能 将一个复杂的对象的构建与它的表示分离、解耦 是一种创建型模式。它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象。 可以使得相同的创建过程可以创建不同的产品对象 建造者模式是一步创建一个复杂的对象 ,它允许用户只通过指定复杂对象的类型和内容就可以构建它们,用户不需要知道内部的具体构建细节 。 增加新的具体建造者无需修改原有代码

mrhanzhou5273的博客 344

生成器模式--创建型模式

1、描述 生成器模式是一种创建型设计模式,使你能够分步骤创建复杂对象。该模式允许你使用相同的创建代码生成不同类型和形式的对象。 2、结构图 生成器(Builder)接口声明在所有类型生成器中通用的产品构造步骤 具体生成器(ConcreateBuilder)提供构造过程的不同实现。具体生成器也可以构造不遵循通用接口的产品 产品(Product)是最终生成的对象。由不同生成器构造的参评无需属于同一类层次结构或接口 主管(Director)类定义调用构造步骤的顺序,这样你就可以创建和复用特定...

qu1993的博客 304
上一篇: 设计模式——抽象工厂模式总结
下一篇: 11月10日学习总结--初识numpy
inside802
博客等级 码龄9年 66粉丝 68原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值