创建型设计模式-构建器(builder)模式-python实现

server/2024/12/22 13:20:11/

设计模式汇总:查看

通俗示例

想象一下,你正在一家餐厅点餐。你告诉服务员你想要一个汉堡,但是汉堡有很多种配置:面包种类、肉类、蔬菜、酱料等。服务员会根据你的要求,一步一步构建出你想要的汉堡。在这里,服务员就扮演了“构建器”的角色,而汉堡则是被构建的“复杂对象”。

通俗解释

构建器模式是一种创建型设计模式,它用于创建复杂对象,允许你逐步构建对象的不同部分,而不需要一次性将所有的配置细节都告诉创建者。这种模式特别适合那些包含多个组成部分,且各部分需要灵活配置的对象。

在构建器模式中,通常包含以下角色:

  1. 产品(Product):最终要构建的复杂对象。
  2. 抽象构建者(Builder):定义构建产品的接口,规定了构建产品的各个步骤。
  3. 具体构建者(Concrete Builder):实现Builder接口,提供构建产品的具体实现,并负责构建产品的具体细节。
  4. 指挥者(Director):负责安排已有模块的构建步骤,指导具体构建者构建出产品。
  5. 客户端(Client):使用指挥者和构建者来创建对象。

构建器模式的优点

  • 易于解耦:构建器的接口与实现分离,使得相同的构建过程可以创建不同的产品。
  • 易于扩展:可以方便地新增具体构建者来构建新的产品。
  • 精细控制:指挥者类可以精细控制产品的创建过程。

Python代码示例

例子1
python"># 产品类
class Burger:def __init__(self):self.bread = Noneself.meat = Noneself.veggies = []self.sauces = []def set_bread(self, bread):self.bread = breaddef set_meat(self, meat):self.meat = meatdef add_veggie(self, veggie):self.veggies.append(veggie)def add_sauce(self, sauce):self.sauces.append(sauce)def __str__(self):return f"Bread: {self.bread}, Meat: {self.meat}, Veggies: {self.veggies}, Sauces: {self.sauces}"# 抽象构建者
class BurgerBuilder:def __init__(self):self.burger = Burger()def create_new_burger(self):passdef add_bread(self):passdef add_meat(self):passdef add_veggies(self):passdef add_sauces(self):passdef get_burger(self):return self.burger# 具体构建者
class ChickenBurgerBuilder(BurgerBuilder):def create_new_burger(self):self.burger = Burger()def add_bread(self, bread):self.burger.set_bread(bread)def add_meat(self, meat):self.burger.set_meat(meat)def add_veggies(self, *veggies):for veggie in veggies:self.burger.add_veggie(veggie)def add_sauces(self, *sauces):for sauce in sauces:self.burger.add_sauce(sauce)# 指挥者
class Chef:def __init__(self, builder):self.builder = builderdef construct_burger(self, bread, meat, veggies, sauces):self.builder.create_new_burger()self.builder.add_bread(bread)self.builder.add_meat(meat)self.builder.add_veggies(*veggies)self.builder.add_sauces(*sauces)return self.builder.get_burger()# 客户端代码
if __name__ == "__main__":builder = ChickenBurgerBuilder()chef = Chef(builder)burger = chef.construct_burger("Whole Wheat", "Chicken", ["Lettuce", "Tomato"], ["Mayo", "Mustard"])print(burger)
例子2
python">from collections import namedtupleclass OnlineShop(object):def __init__(self, builder):"""初始化Macbook对象。使用命名元组来定义Macbook的结构,包括cpu、memory、ssd和graphics属性。这种方式初始化对象可以保持代码的简洁性和可读性。参数:builder - 一个构建者对象,包含了Macbook的各个部件的信息。假设这个构建者对象已经通过其他方式定义并初始化了cpu、memory、ssd和graphics属性。"""# 使用命名元组来创建Macbook类的实例,这种方式简洁并能明确表示实例的属性Macbook = namedtuple('Macbook', 'cpu memory ssd graphics')# 使用构建者对象的属性来初始化Macbook实例self.macbook = Macbook(builder.cpu, builder.memory,builder.ssd, builder.graphics)def __str__(self):return str(self.macbook)class MacbookBuilder(object):def __init__(self):self.cpu = '2.7GHz'self.memory = '16G'self.ssd = '512GB'self.graphics = 'Radeon Pro 455'def upgrade_cpu(self, cpu):self.cpu = cpureturn selfdef upgrade_memory(self, memory):raise ValueError('{0} is max'.format(self.memory))def upgrade_ssd(self, ssd):self.ssd = ssdreturn selfdef upgrade_graphics(self, graphics):self.graphics = graphicsreturn selfdef build(self):"""创建并返回一个OnlineShop实例。该方法作为Builder模式的一部分,负责组装完成后最终对象的创建。它避免了直接在客户端代码中进行复杂的对象组装,而是通过一步一步构建的方式来简化对象的创建过程。返回:OnlineShop: 一个在线商店的实例,包含了之前通过Builder方法设置的所有属性。"""return OnlineShop(self)if __name__ == '__main__':# 定制了一台 Macbook Pro 电脑的实例,在建造者模式中,# 需要定义一系列可供选择的方法去丰富实例,实现一个复杂的对象my_macbook = OnlineShop.MacbookBuilder() \.upgrade_cpu('2.8GHz') \.upgrade_ssd('1TB') \.upgrade_graphics('Radeon Pro 560') \.build()print(my_macbook)

总结

构建器模式适用于创建复杂对象,它将一个复杂对象的构建与其表示分离,使得同样的构建过程可以创建不同的表示。当你需要创建的对象有很多配置选项,且每个选项都有多种可能时,构建器模式是一个很好的选择。


http://www.ppmy.cn/server/109569.html

相关文章

【面试经验】三天速通字节DevInfra三面

字节效率是真的高,前两面都是面完10分钟直接约下一面,三面面完没消息了,不知道是不是寄了,原本感觉和面试官聊的还挺好的来着 面经,只挑了有印象的。 一面 45min 聊实习项目。面试官要求详细讲了系统架构。postgres…

OCCT-计算二维图形的中轴线

方案一&#xff1a;三角剖分、重心的连接 // 获取TopoDS_Shape中所有三角形的重心并连接成中轴线 TopoDS_Shape GetTriangleCentroids(const TopoDS_Shape& shape) {std::vector<gp_Pnt> points;TopExp_Explorer explorer(shape, TopAbs_FACE);while (explorer.More…

AI学习记录 - 线性代数(3Blue1Brown)

一天更新一点点&#xff0c;只更新重点内容&#xff0c;一句话定义&#xff0c;简单的定义&#xff0c;避免脑子及记太多 向量的加法就是一种趋势运动 向量的延长缩短&#xff0c;就是分量的延长缩短 基向量就是在平面或者任意维度空间随便定义的一个向量 多个基向量的组合可…

[英语单词] feedback

Embedded computers and networks monitor and control the physical processes, usually with feedback loops where physical processes affect computations and vice versa. https://www2.eecs.berkeley.edu/Pubs/TechRpts/2007/EECS-2007-72.pdf feedback的普遍意思是&am…

《操作系统》之操作系统概述、处理器管理【知识点题练1】

一、选择题 【进程的特性】1.各进程向前推进的速度是不可预知的&#xff0c;体现出“走走停停”的特征&#xff0c;称为进程的&#xff08;D &#xff09;。 A.动态性 B.并发性 C.调度性 D.异步性 2.操作系统中有一组常称为特殊系统调用&#xff0c;它不能被系统中断&…

c++单例模式(Singleton)多种实现方式及最优比较

前言 关于C单例模式的写法&#xff0c;大家都很熟悉。早期的设计模式中有代码示例。比如&#xff1a; class Singleton {private: static Singleton *instance;public: static Singleton *getInstance() {if (NULL instance)instance new Singleton();return instance;} };…

jenkins发送html邮件配置步骤与注意事项?

jenkins发送html邮件如何实现&#xff1f;Jenkins的配置方法&#xff1f; 通过jenkins发送html邮件&#xff0c;开发团队可以及时获取构建状态的详细报告&#xff0c;从而快速响应问题&#xff0c;提高工作效率。AokSend将详细介绍jenkins发送html邮件的配置步骤与注意事项&am…

cesium加载在线3dtiles

1、通过cesium.ion官网申请一个Access Tokens 2、加载在线建筑物白膜&#xff0c;代码如下&#xff1a; const tileset viewer.scene.primitives.add( await Cesium.createOsmBuildings({ enableShowOutline: false }) ); 3、修改建筑物白膜样式 tileset.style new Cesiu…