建造者模式(Builder Pattern)

简介: 建造者模式(Builder Pattern)是一种创建型设计模式,它可以将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式(Builder Pattern)是一种创建型设计模式,它可以将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。

建造者模式通常包含四个角色:产品、抽象建造者、具体建造者和指挥者。产品是最终构建出来的对象,抽象建造者定义了构建产品所需的方法,具体建造者实现了抽象建造者的方法,用于构建具体的产品。指挥者负责控制产品的构建过程,它通常接收一个抽象建造者对象作为参数,根据一定的顺序调用抽象建造者的方法来构建产品。

以下是一个使用建造者模式的示例代码:

python
Copy
class Pizza:
def init(self):
self.dough = ""
self.sauce = ""
self.toppings = []

def __str__(self):
    return f"Dough: {self.dough}, Sauce: {self.sauce}, Toppings: {', '.join(self.toppings)}"

class PizzaBuilder:
def create_new_pizza(self):
self.pizza = Pizza()

def build_dough(self):
    pass

def build_sauce(self):
    pass

def build_toppings(self):
    pass

def get_pizza(self):
    return self.pizza

class MargheritaPizzaBuilder(PizzaBuilder):
def build_dough(self):
self.pizza.dough = "Regular"

def build_sauce(self):
    self.pizza.sauce = "Tomato"

def build_toppings(self):
    self.pizza.toppings.append("Mozzarella")
    self.pizza.toppings.append("Basil")

class HawaiianPizzaBuilder(PizzaBuilder):
def build_dough(self):
self.pizza.dough = "Thin"

def build_sauce(self):
    self.pizza.sauce = "Barbecue"

def build_toppings(self):
    self.pizza.toppings.append("Ham")
    self.pizza.toppings.append("Pineapple")

class Director:
def init(self, builder):
self.builder = builder

def construct_pizza(self):
    self.builder.create_new_pizza()
    self.builder.build_dough()
    self.builder.build_sauce()
    self.builder.build_toppings()

pizza_builder1 = MargheritaPizzaBuilder()
pizza_builder2 = HawaiianPizzaBuilder()

director1 = Director(pizza_builder1)
director2 = Director(pizza_builder2)

director1.construct_pizza()
pizza1 = pizza_builder1.get_pizza()

director2.construct_pizza()
pizza2 = pizza_builder2.get_pizza()

print(pizza1) # 输出 "Dough: Regular, Sauce: Tomato, Toppings: Mozzarella, Basil"
print(pizza2) # 输出 "Dough: Thin, Sauce: Barbecue, Toppings: Ham, Pineapple"
在这个示例中,Pizza 是产品,它具有 dough、sauce 和 toppings 属性。PizzaBuilder 是抽象建造者,定义了创建产品所需的方法,包括 create_new_pizza、build_dough、build_sauce、build_toppings 和 get_pizza。MargheritaPizzaBuilder 和 HawaiianPizzaBuilder 是具体建造者,实现了 PizzaBuilder 的方法,用于构建具体的产品。Director 是指挥者,负责控制产品的构建过程。

当客户端调用 Director 的 construct_pizza 方法时,它会根据传入的建造者对象,调用相应的方法来构建产品。

要使用建造者模式,首先需要确定需要创建的复杂对象和复杂对象的构建过程。然后实现一个抽象建造者类,并在其中定义创建产品所需的方法。接着实现一个具体建造者类,并在其中实现抽象建造者类中的方法,用于构建具体的产品。最后实现一个指挥者类,在其中定义一个构建产品的方法,并接收一个抽象建造者对象作为参数,根据一定的顺序调用抽象建造者的方法来构建产品。

image.png

意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。

主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。

何时使用:一些基本部件不会变,而其组合经常变化的时候。

如何解决:将变与不变分离开。

关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。

应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。

优点:

分离构建过程和表示,使得构建过程更加灵活,可以构建不同的表示。
可以更好地控制构建过程,隐藏具体构建细节。
代码复用性高,可以在不同的构建过程中重复使用相同的建造者。
缺点:

如果产品的属性较少,建造者模式可能会导致代码冗余。
建造者模式增加了系统的类和对象数量。
使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。

建造者模式在创建复杂对象时非常有用,特别是当对象的构建过程涉及多个步骤或参数时。它可以提供更好的灵活性和可维护性,同时使得代码更加清晰可读。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。

《Head First 设计模式》第 4 章:工厂模式。这本书是一本很好的学习设计模式的入门书籍,适合初学者阅读。

《设计模式:可复用面向对象软件的基础》。这是一本经典的设计模式书籍,其中详细介绍了建造者模式以及其他 22 种设计模式。

《大话设计模式》第 8 章:建造者模式。这本书通过生动的故事情节和通俗易懂的语言介绍了各种设计模式,适合初学者阅读。

设计模式视频教程。有很多优秀的设计模式视频教程,可以通过观看视频来更好地理解建造者模式和其他设计模式。

GitHub 上的设计模式示例代码。可以通过查看其他开发者编写的示例代码来学习建造者模式的具体实现方式。

目录
相关文章
|
应用服务中间件 Linux nginx
【Linux环境】centOS 7安装nginx详细步骤及nginx配置
【Linux环境】centOS 7安装nginx详细步骤及nginx配置
3635 0
|
6月前
|
JSON 缓存 API
标题:京东平台获取商品SKU信息的API接口详解与使用指南
本文详细介绍京东商品SKU信息API接口,涵盖功能、调用流程、参数说明及返回格式。通过该接口可获取商品价格、库存、规格等关键数据,适用于电商开发与数据分析。内容包括应用注册、授权认证、签名生成、请求示例与错误处理,并提供Python调用示例,助力开发者高效集成京东商品数据。(238字)
1010 0
|
前端开发 UED 开发者
开发同学如何理解业务?
本文深入探讨了理解业务的重要性及其对于软件开发流程的深远影响。
|
人工智能 程序员 C++
通义灵码 AI 程序员-全平台AI程序员插件
人工智能正在深度融入开发流程,阿里云通义灵码AI程序员全面上线,支持VS Code与JetBrains IDEs,是国内首个真正落地的AI程序员工具。它不仅能生成代码、续写功能,还支持跨语言编程和图片生成代码。相较1.0版本,新增多项功能,模型更丰富,生成速度更快。快来体验未来开发的魅力!链接附上,欢迎探索。
760 7
|
Ubuntu NoSQL Linux
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
698 6
《docker基础篇:3.Docker常用命令》包括帮助启动类命令、镜像命令、有镜像才能创建容器,这是根本前提(下载一个CentOS或者ubuntu镜像演示)、容器命令、小总结
|
机器学习/深度学习 数据采集 算法
Python实现GWO智能灰狼优化算法优化支持向量机回归模型(svr算法)项目实战
Python实现GWO智能灰狼优化算法优化支持向量机回归模型(svr算法)项目实战
|
关系型数据库 MySQL Go
golang使用gorm操作mysql1
golang使用gorm操作mysql1
golang使用gorm操作mysql1
|
自然语言处理 新能源 程序员
长安汽车 X 阿里云:合作研发汽车垂域大模型
长安汽车 X 阿里云:合作研发汽车垂域大模型
616 1
|
安全 搜索推荐 物联网
未来操作系统发展趋势分析与展望
随着科技的不断进步,操作系统作为计算机系统的核心组成部分也在不断演进。本文将从智能化、安全性、跨平台性等方面探讨未来操作系统的发展趋势,并展望其在技术领域的应用前景。
1093 29