建造者模式(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 上的设计模式示例代码。可以通过查看其他开发者编写的示例代码来学习建造者模式的具体实现方式。

目录
相关文章
查看 npm 包下载量(简单快捷,数据精确)
查看 npm 包下载量(简单快捷,数据精确)
1046 0
|
12月前
|
机器学习/深度学习 人工智能 运维
企业内训|LLM大模型在服务器和IT网络运维中的应用-某日企IT运维部门
本课程是为某在华日资企业集团的IT运维部门专门定制开发的企业培训课程,本课程旨在深入探讨大型语言模型(LLM)在服务器及IT网络运维中的应用,结合当前技术趋势与行业需求,帮助学员掌握LLM如何为运维工作赋能。通过系统的理论讲解与实践操作,学员将了解LLM的基本知识、模型架构及其在实际运维场景中的应用,如日志分析、故障诊断、网络安全与性能优化等。
335 2
|
12月前
|
人工智能
新手必看,写歌词的技巧和方法新分享,妙笔生词AI智能写歌词软件
对于新手,写歌词不再难。本文分享了写歌词的实用技巧,如积累生活素材、明确主题、合理安排主副歌、简洁有力的语言表达等。推荐使用“妙笔生词智能写歌词软件”,其AI功能可助你灵感不断,轻松创作。
|
7月前
|
人工智能 程序员 C++
通义灵码 AI 程序员-全平台AI程序员插件
人工智能正在深度融入开发流程,阿里云通义灵码AI程序员全面上线,支持VS Code与JetBrains IDEs,是国内首个真正落地的AI程序员工具。它不仅能生成代码、续写功能,还支持跨语言编程和图片生成代码。相较1.0版本,新增多项功能,模型更丰富,生成速度更快。快来体验未来开发的魅力!链接附上,欢迎探索。
293 7
|
9月前
|
存储 固态存储 应用服务中间件
阿里云服务器租赁价格:实例配置、预留实例券、块存储、带宽、快照最新收费标准
阿里云服务器收费项目有实例价格、预留实例券、专有宿主机、块存储价格、存储容量单位包、带宽价格和快照服务价格,收费模式有包年包月和按量付费模式。2025年阿里云继续推出各种云服务器优惠,本文为大家汇总了2025年阿里云服务器各个收费项目的最新收费标准与云服务器的最新活动价格,以供参考和了解。
675 24
|
12月前
|
存储 关系型数据库 MySQL
MySQL数据库锁:共享锁和独占锁
本文详细介绍了`InnoDB`存储引擎中的两种行级别锁:共享锁(S锁)与排他锁(X锁)。通过具体示例展示了这两种锁的工作机制及其在`InnoDB`与`MyISAM`引擎中的表现差异。文章还提供了锁的兼容性矩阵,帮助读者更好地理解锁之间的互斥关系。最后总结了两种锁的特点及适用场景。适合希望深入了解`MySQL`并发控制机制的读者阅读。
426 1
|
存储 NoSQL Java
分布式session-SpringSession的应用
Spring Session 提供了一种创建和管理 Servlet HttpSession 的方案,默认使用外置 Redis 存储 Session 数据,解决了 Session 共享问题。其特性包括:API 及实现用于管理用户会话、以应用容器中性方式替换 HttpSession、简化集群会话支持、管理单个浏览器实例中的多个用户会话以及通过 headers 提供会话 ID 以使用 RESTful API。Spring Session 通过 SessionRepositoryFilter 实现,拦截请求并转换 request 和 response 对象,从而实现 Session 的创建与管理。
293 0
分布式session-SpringSession的应用
|
缓存 监控 算法
【Java】Java内存溢出:原因、预防和解决方法
【Java】Java内存溢出:原因、预防和解决方法
1168 2
|
机器学习/深度学习 数据采集 算法
Python实现GWO智能灰狼优化算法优化支持向量机回归模型(svr算法)项目实战
Python实现GWO智能灰狼优化算法优化支持向量机回归模型(svr算法)项目实战