当前位置: 首页 > article >正文

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

设计模式汇总:查看

通俗示例

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

通俗解释

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

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

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

构建器模式的优点

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

Python代码示例

例子1
# 产品类
class Burger:
    def __init__(self):
        self.bread = None
        self.meat = None
        self.veggies = []
        self.sauces = []
    
    def set_bread(self, bread):
        self.bread = bread
    
    def set_meat(self, meat):
        self.meat = meat
    
    def 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):
        pass
    
    def add_bread(self):
        pass
    
    def add_meat(self):
        pass
    
    def add_veggies(self):
        pass
    
    def add_sauces(self):
        pass
    
    def 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 = builder
    
    def 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
from collections import namedtuple


class 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 = cpu
            return self

        def upgrade_memory(self, memory):
            raise ValueError('{0} is max'.format(self.memory))

        def upgrade_ssd(self, ssd):
            self.ssd = ssd
            return self

        def upgrade_graphics(self, graphics):
            self.graphics = graphics
            return self

        def 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.kler.cn/news/283689.html

相关文章:

  • 35. 交错动画 导航列表项的悬停和聚焦效果
  • Linux下UDP编程
  • InternVL 多模态模型部署微调实践
  • 物联网平台组件2: 平台校验规则
  • 如何构建社区康养养老系统:Java SpringBoot与Vue实战养老管理系统
  • uniapp的锁屏上文字的显示与隐藏
  • ES6中新增的Set方法详解
  • 小资人群“轻社交”需求与创新营销模式——以“2+1 链动模式小程序、AI 智能名片、S2B2C 商城系统”为例
  • 代码随想录Day 28|题目:122.买卖股票的最佳时机Ⅱ、55.跳跃游戏、45.跳跃游戏Ⅱ、1005.K次取反后最大化的数组和
  • 防抖函数 debounce debouncePromise
  • 获得两类相关点之间的线性关系
  • 简易STL实现 | List的实现
  • 【leetcode刷题记录】二叉树遍历
  • 易查分如何查询图片?
  • 梧桐数据库(WuTongDB):什么是“顺序扫描”
  • 1.3金融术语的宝典
  • PHP房产管理多终端系统灵活应对各种管理需求系统小程序源码
  • 16.神经网络 - 卷积层
  • Python-MNE-源空间和正模型07:修复BEM和头表面
  • Linux 7 静默安装oracle 19c 单机
  • 深度学习常见面试题(2024.8.30笔记)
  • 如何在知行之桥上通过业务单号查找原始报文?
  • 英文论文格式编辑(二)
  • redis list 单推送消息,批量消费消息,springboot实现
  • Nginx配置实例-负载均衡
  • 密码学(二)---DES、SM、RSA
  • c++中的匿名对象及内存管理及模版初阶
  • 【系统架构师软考】计算机网络知识(四)
  • 在类Unix操作系统(如Linux)上运行Windows应用程序方法小记
  • flutter和原生Android以及IOS开发相比有什么优缺点?