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

模板模式 VS 建造者模式

模板模式和建造者模式是两种不同的设计模式,下面从定义、结构、应用场景等方面介绍它们的区别,并给出 Python 示例代码。

定义

  • 模板模式:定义了一个操作中的算法骨架,将一些步骤的实现延迟到子类中。这样,子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
  • 建造者模式:将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。它允许你逐步构建一个复杂对象,而不是一次性创建它。

结构与角色

  • 模板模式
    • 抽象类:定义了算法的骨架,包含一些抽象方法和具体方法。抽象方法需要在子类中实现,具体方法则提供了默认的实现。
    • 具体子类:继承抽象类,实现抽象方法,完成算法中特定步骤的具体实现。
  • 建造者模式
    • 抽象建造者:定义了创建产品各个部分的抽象方法。
    • 具体建造者:实现抽象建造者的方法,构建和装配产品的各个部分。
    • 指挥者:负责调用建造者的方法来构建产品。
    • 产品:被构建的复杂对象。

适用场景

  • 模板模式
    • 多个子类有公共的方法,并且逻辑基本相同时。
    • 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能由各个子类实现。
    • 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。
  • 建造者模式
    • 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
    • 当构造过程必须允许被构造的对象有不同表示时。

Python 示例代码

模板模式示例
  1. AbstractClass 作为抽象类定义算法骨架 template_method,含默认 step2 及待实现的 step1step3
  2. ConcreteClass1 和 ConcreteClass2 继承该抽象类,实现各自的 step1 和 step3
  3. 主程序创建这两个子类的实例并调用 template_method
  4. 按既定骨架执行不同子类的自定义步骤,实现算法复用与扩展。
# 抽象类
class AbstractClass:def template_method(self):self.step1()self.step2()self.step3()def step1(self):passdef step2(self):print("执行步骤 2 的默认操作")def step3(self):pass# 具体子类
class ConcreteClass1(AbstractClass):def step1(self):print("具体子类 1 执行步骤 1")def step3(self):print("具体子类 1 执行步骤 3")class ConcreteClass2(AbstractClass):def step1(self):print("具体子类 2 执行步骤 1")def step3(self):print("具体子类 2 执行步骤 3")# 使用示例
if __name__ == "__main__":concrete1 = ConcreteClass1()concrete1.template_method()concrete2 = ConcreteClass2()concrete2.template_method()
建造者模式示例 

想象你要组装一台电脑:

  1. 你可以选择不同的CPU、内存、硬盘、显卡等
  2. 组装步骤是固定的(先装主板,再装CPU,然后内存...)
  3. 但每个步骤的具体实现可以不同

建造者模式就是把"组装过程"和"具体零件"分离,这样你可以用相同的组装过程创建不同的电脑配置。

# 产品类 - 最终要构建的复杂对象
class Computer:def __init__(self):self.cpu = Noneself.memory = Noneself.disk = Noneself.gpu = Nonedef __str__(self):return f"Computer配置: CPU={self.cpu}, 内存={self.memory}, 硬盘={self.disk}, 显卡={self.gpu}"# 抽象建造者 - 定义构建步骤
class ComputerBuilder:def __init__(self):self.computer = Computer()def build_cpu(self):passdef build_memory(self):passdef build_disk(self):passdef build_gpu(self):passdef get_result(self):return self.computer# 具体建造者 - 实现具体构建步骤
class GamingComputerBuilder(ComputerBuilder):def build_cpu(self):self.computer.cpu = "Intel i9"def build_memory(self):self.computer.memory = "32GB DDR5"def build_disk(self):self.computer.disk = "1TB SSD"def build_gpu(self):self.computer.gpu = "NVIDIA RTX 4090"class OfficeComputerBuilder(ComputerBuilder):def build_cpu(self):self.computer.cpu = "Intel i5"def build_memory(self):self.computer.memory = "16GB DDR4"def build_disk(self):self.computer.disk = "512GB SSD"def build_gpu(self):self.computer.gpu = "集成显卡"# 指挥者 - 控制构建过程
class Director:def __init__(self, builder):self.builder = builderdef construct(self):self.builder.build_cpu()self.builder.build_memory()self.builder.build_disk()self.builder.build_gpu()return self.builder.get_result()# 客户端代码
if __name__ == "__main__":# 构建游戏电脑gaming_builder = GamingComputerBuilder()director = Director(gaming_builder)gaming_computer = director.construct()print(gaming_computer)# 构建办公电脑office_builder = OfficeComputerBuilder()director = Director(office_builder)office_computer = director.construct()print(office_computer)

总结

  • 模板模式主要关注的是算法的骨架,将一些步骤的实现延迟到子类中,强调的是算法的复用和扩展。
  • 建造者模式主要关注的是复杂对象的构建过程,将构建和表示分离,强调的是对象构建过程的灵活性和可配置性。

相关文章:

  • Sublime Text快速搭建Lua语言运行环境
  • 可以下载blender/fbx格式模型网站
  • 【C++游戏引擎开发】第31篇:物理引擎(Bullet)—碰撞检测系统
  • 学习Python网络爬虫的实例
  • SpringBoot 集成滑块验证码AJ-Captcha行为验证码 Redis分布式 接口限流 防爬虫
  • 数据清洗-电商双11美妆数据分析
  • Python入门(一)
  • 怎样通过API 实现python调用Chatgpt,gemini
  • 爱情的本质是什么--deepseek
  • 20250506联想Lenovo笔记本电脑的USB鼠标失效之后在WIN10下的关机的方法【触摸板被禁用】
  • Hologres x 函数计算 x Qwen3,对接MCP构建企业级数据分析 Agent
  • C++笔记-二叉搜索树(包括key,key/value搜索场景等)
  • 【SDRS】面向多模态情感分析的情感感知解纠缠表征转移
  • Ubuntu开放端口
  • Windows玩游戏的时候,一按字符键就显示桌面
  • C++ 渗透 数据结构中的二叉搜索树
  • Linux:进程间通信---命名管道共享内存
  • Python 脚本打包成可执行的 .exe 文件
  • 【quantity】0 README.md文件
  • JavaScript 到命令和控制 (C2) 服务器恶意软件分析及防御
  • 韩正出席庆祝中国欧盟建交50周年招待会并致辞
  • 默茨在第二轮投票中当选德国总理
  • 外交部:中方和欧洲议会决定同步全面取消对相互交往的限制
  • 习近平将对俄罗斯进行国事访问并出席纪念苏联伟大卫国战争胜利80周年庆典
  • 2024年境内酒店住宿行业指标同比下滑:酒店行业传统增长模式面临挑战
  • 保险经纪公司元保在纳斯达克挂牌上市,去年净赚4.36亿元