建造者模式和模板方法模式的区别

Nacos 2.3.2实战:5分钟搞定达梦数据库插件配置(含避坑指南) 本文详细介绍了在Nacos 2.3.2中配置达梦数据库数据源插件的完整实战流程。通过解析SPI插件机制,提供从环境准备、插件编译部署到核心配置的逐步指南,并重点分享了驱动加载、SQL兼容性等高频问题的避坑解决方案,助力开发者高效完成国产化数据库适配。 阅读详情

建造者模式 vs 模板方法模式 核心区别

一、一句话本质差异

  1. 模板方法模式(Template Method)
    控制一套固定流程骨架,步骤顺序不能改,只允许重写内部单个步骤;侧重算法流程复用。
  2. 建造者模式(Builder)
    拆分复杂对象的各个部件构造逻辑,部件组装顺序可灵活调整,最终统一产出完整对象;侧重复杂对象分步构建。

二、详细对比

1. 核心目标不同

模板方法
  • 目标:复用算法流程
  • 场景:一件事的执行步骤固定,只是每一步实现不同
  • 例子:
    饮料制作流程固定:烧水→加原料→冲泡→装杯;茶和咖啡只替换“加原料”步骤,顺序永远不变。
建造者
  • 目标:分步组装复杂对象
  • 场景:对象由多个独立部件组成,组装顺序可变、部件可替换,最终生成不同成品
  • 例子:
    组装电脑:CPU、主板、显卡、硬盘是独立部件;可以先装主板再装CPU,也能调换顺序;高配/低配电脑只是部件不同。

2. 流程控制权

模板方法
  • 父类(抽象类)完全控制流程顺序
    模板方法定义完整步骤顺序,子类只能实现步骤,不能修改执行先后。
// 父类固定流程
public final void makeDrink() {
    boilWater();    // 固定第一步
    addMaterial();  // 子类实现
    brew();         // 固定第三步
    pour();         // 固定第四步
}

final 模板方法防止子类篡改流程。

建造者
  • Director指挥组装顺序,可灵活更换顺序;Builder只负责造单个零件
    建造者只提供 buildCPU()、buildGPU() 等单个部件构建方法;导演类决定先装哪个,甚至可以两套组装逻辑。
// 导演控制组装顺序,可随意调换
public Computer constructHighEnd() {
    builder.buildCPU();
    builder.buildGPU();
    builder.buildDisk();
    return builder.getResult();
}
public Computer constructLowEnd() {
    builder.buildDisk();
    builder.buildCPU();
    // 不造显卡
    return builder.getResult();
}

3. 产出物不同

  • 模板方法:产出执行结果/行为(一段流程、一个动作),不一定是对象。
    比如生成文档、制作饮品、游戏角色升级流程。
  • 建造者:产出复杂复合对象(由多个子部件组合而成),一定是完整实体对象。
    比如电脑、房屋、订单、复杂报文。

4. 结构组成对比

模板方法 组成
  1. 抽象父类:模板方法(固定流程)+ 抽象步骤
  2. 具体子类:实现抽象步骤
    没有分离“构建”和“组装”,流程和步骤耦合在一个继承体系
建造者 组成
  1. 抽象Builder:定义所有部件构建接口
  2. 具体Builder:实现每个部件怎么造
  3. Director:专门控制组装顺序(可选)
  4. 产品Product:最终复杂对象
    职责彻底拆分:造零件的类、组装顺序的类、成品类完全分离

5. 拓展方式(修改逻辑)

模板方法

只能新增子类重写步骤,流程骨架永远不变;不适合增减步骤。
如果需要新增流程步骤,必须修改父类模板方法,违反开闭原则。

建造者
  • 新增部件:扩展Builder接口即可
  • 更换组装顺序:新增Director构造方法,不用修改Builder
  • 增减部件:组装时调用/不调用对应build方法即可,扩展性更强

三、最直观代码示例区分

示例1:模板方法(固定流程)

class DrinkTemplate:
    # 固定流程,顺序不可改
    def make(self):
        self.boil_water()
        self.add_raw()
        self.brew()
        self.pour_cup()

    def boil_water(self):
        print("烧水")
    def brew(self):
        print("浸泡")
    def pour_cup(self):
        print("倒入杯子")
    # 留给子类实现
    def add_raw(self):
        pass

class Tea(DrinkTemplate):
    def add_raw(self):
        print("加茶叶")

class Coffee(DrinkTemplate):
    def add_raw(self):
        print("加咖啡粉")

# 使用:流程永远一样
Tea().make()
Coffee().make()

示例2:建造者模式(组装对象,顺序可控)

# 产品:电脑
class Computer:
    def __init__(self):
        self.cpu = ""
        self.gpu = ""

# 建造者抽象
class ComputerBuilder:
    def build_cpu(self): pass
    def build_gpu(self): pass
    def get_pc(self): pass

# 具体建造者
class GamePCBuilder(ComputerBuilder):
    def __init__(self):
        self.pc = Computer()
    def build_cpu(self):
        self.pc.cpu = "i9"
    def build_gpu(self):
        self.pc.gpu = "4090"
    def get_pc(self):
        return self.pc

# 导演:控制组装顺序
class Director:
    def build_game_pc(self, builder):
        builder.build_cpu()
        builder.build_gpu()
    def build_simple_pc(self, builder):
        # 调换顺序、省略显卡
        builder.build_gpu()
        builder.build_cpu()

# 使用
builder = GamePCBuilder()
dir = Director()
dir.build_game_pc(builder)
pc = builder.get_pc()

四、一张总结表

对比维度模板方法模式建造者模式
核心关注点固定算法流程,复用步骤骨架拆分对象部件,灵活组装复杂实体
步骤顺序父类固定,不可修改由Director控制,可自由调换/删减
产出一段行为/流程执行结果多部件组合的复杂对象
类关系依靠继承扩展步骤依靠组合拆分构建与组装逻辑
职责拆分流程和步骤都在同一继承树,耦合高零件构建、组装顺序、成品完全分离
适用场景步骤固定,仅内部实现有差异对象结构复杂,部件多、组装可变

五、快速选型口诀

  1. 流程顺序固定,只是步骤实现不同 → 模板方法
  2. 要拼一个由多个零件组成的复杂对象,组装顺序可改 → 建造者
【MM小贴士】关于SAP系统中关税的处理方式 的运费,这部分来讲,我们关税的计价基础,就应该是货物价值+包邮到中国港口的运费,完后进行报关操作,缴纳关税,后半段从中国港口拉回到企业里面的运输费,就会做到费用里面去,而不是计入到存货成本。1、我们自己的企业和国外厂家A购买一项物资,厂家A的报价会分成几个组成部分货物本身的价值或者货物本身的价值+到国外港口的运费或者货物本身的价值+到中国港口的运费或者货物本身的价值+包邮到你们自己企业的整体运费。所以我的关税就是不确定的。重点是运费是哪一段的运费,如何结算,结算的货币,何时能够确定运费。......... 阅读详情

相关推荐

知识导航神器:Obsidian Breadcrumbs 插件全攻略

Parent: 插件Child: Breadcrumbs 用法这样,它就能识别出你和其他笔记的关系。

m0_73735578的博客 1630

模板模式 VS 建造者模式

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

u010130947的专栏 589

保姆级教程:用YOLOv8/9/10搞定仪表盘指针识别,附完整数据集和Python环境配置

本文提供了一份基于YOLOv8/v9/v10的仪表盘指针检测全流程指南,涵盖环境配置、数据集构建、模型选型、训练调优和部署落地等关键步骤。通过详细的代码示例和实战经验,帮助开发者高效解决工业视觉中的仪表盘检测难题,特别适合电力巡检、智能监控等应用场景。

weixin_29031057的博客 1335

模板方法模式和建造者模式区别

这个Builder,其实和模板模式非常的像,但是也有区别,那就是在模板模式中父类对子类中的实现进行操作,在父类之中进行一件事情的处理,但是在Builder模式之中,父类和子类都不用关心怎么处理,而是用另一个类来完成对这些方法的有机组合,这个类的职责就是‘监工’,规定了到底要怎么样有机的组合这些方法。在监工类(Director)中,将父类组合进去,然后调用父类的操作来抽象的实现一件事情,这就是面向接口(抽象)变成的妙处了,当然这个Builder可以使接口也可以是抽象类,在这里我们使用抽象类。 关于...

gaoshan12345678910的博客 662

自研半导体Fab缺陷分析系统:从Klarf解析到Defect Map可视化的实战替代方案

本文分享了自研半导体Fab缺陷分析系统的实战经验,重点解析了Klarf文件格式与坐标系转换的核心技术,并详细介绍了从数据解析到Defect Map可视化的完整实现路径。该系统旨在为成本敏感或追求技术自主的团队提供一套功能完备的Klarity Defect平替方案,有效降低对昂贵商业软件的依赖,实现缺陷数据的自主分析与可视化。

y7z8a的博客 716

华为云CodeHub保姆级教程:从零开始,5分钟搞定本地代码上传(含常见报错解决)

本文提供华为云CodeHub的保姆级教程,从零开始5分钟完成本地代码上传,涵盖环境准备、仓库创建、远程连接及常见报错解决。特别适合新手开发者快速掌握Git命令与云端协作流程,确保代码安全高效上传。

weixin_30443075的博客 481

设计模式-05.建造者模式与模板方法模式比较

Builder 建造者模式 Builder 建造者模式,其实和模板模式非常的像,但是也有区别,那就是在模板模式中父类对子类中的实现进行操作,在父类之中进行一件事情的处理,但是在 Builder 模式之中,父类和子类都不用关心怎么处理,而是用另一个类来完成对这些方法的有机组合,这个类的职责就是监工,规定了到底要怎么样有机的组合这些方法。在监工类(Director)中,将父类组合进去,然后调用父类的操作来抽象的实现一件事情,这就是面向接口(抽象)变成的妙处了,当然这个 Builder 可以使接口也可以是抽象类,

ctotalk 8627

【NIFI】实现HANA->ORACLE数据同步

实现 HANA->ORACLE数据同步。

weixin_43159039的博客 1510

模板方法模式VS建造者模式

今天再来两个设计模式的对决,模板方法模式VS建造者模式。 首先,看看模板方法模式的定义:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。它的UML图如下: AbstractClass是抽象类,其实也就是一个抽象模板,它给出了一个顶级逻辑的骨架,而逻辑的组成步骤在相应的抽象操作中,推迟到子类

flyingleo1981的专栏 591

prplOS适配USB LAN网卡

本文介绍了将USB LAN网卡(如rndis0)适配到prplOS的LAN管理流程。

四儿家的小祖宗的博客 322

5、自动化代码结构与运维系统的优化

本文探讨了自动化代码结构与运维系统的优化方法,涵盖审批流程的模块化设计、日志记录与工单系统的集成、通知方式的选择、错误处理的策略以及持续改进的实践。同时,深入分析了运维盲目性问题,通过故障案例揭示了关键指标缺失和日志未充分利用的弊端,提出了开发与运维角色转变的必要性。文章还介绍了如何生成有用的系统指标、建立良好的日志习惯以及实施日志聚合,以提升系统的可观测性和可靠性。最终通过总结和流程图展示了优化措施的核心要点,为构建高效、可靠的运维体系提供了指导。

pp12345的博客 71

Java设计模式之模板方法模式和建造者模式

一、前期回顾 上一篇《Java 设计模式之工厂方法模式与抽象工厂模式》介绍了三种工厂模式,分别是工厂方法模式,简单工厂方法模式,抽象工厂模式,文中详细根据实际场景介绍了三种模式的定义,实践,最后总结了三种方式的区别,以及各个模式的适用场景。这一篇博文我们来学习下模板方法模式和建造者模式。 二、模板方法模式和建造者模式的定义与实践 2.1 模板方法模式的定义和实践 定义:Define the s...

weixin_33861800的博客 618

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

建造者模式简介

建造者模式听起来有点高大上, 也是程序猿之间常常提起的模式之一. 其实它有1个前提跟模板方法模式(Template Method)有点类似, 就是建造这个过程可以分拆成若干个部分(步骤). 我们先看定义. 一, 建造者模式的定义 建造者模式(Builder),  将1个复杂对象的构建与它的表示分离.  使得同样的构建过程可以创建不同的表示. 定义很简练啊.

nvd11的专栏 784

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

java设计模式建造_java设计模式-建造者模式

建造者模式:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创造不同的表示。建造者模式将一个产品的内部表象和产品的生成过程分割开来,建造对象的时候只需要指定需要建造的类型,而不必了解具体的建造过程。一个玩具工厂,工人们建造新的玩具人时,需要逐个安装各个部分,种类有胖虎和小夫。万一粗心大意忘记装了某个部分,就出现了不合格的玩具,缺胳膊少腿。为了减少次品率,老板引入了一台机器,设定好程序后,...

weixin_36329939的博客 175

8.建造者模式

1.说明 请参阅本系列第一章节 2.建造者模式说明 构造者模式:将一个复杂的构建与它的表示分离,使得同样的构建过程,可以创建不同的表示。即生成具有不同内部表象的产品对象。在使用的时候,用户只需要知道构建的对象就行了,而不需要知道构建的细节。客户端通过调用指挥者的接口,来控制构建过程,使得能够隔离用户的构建过程 注意事项:指挥者的构建过程必须足够普遍,以此来构建不同的具体的对象。如果这些构建的

zhang_int_int的专栏 460

3. JavaScript 设计模式(模板模式,建造者模式)

模板方法模式VS建造者模式!!!  二话不多,先学完在比较!!! 1.模板模式 定义:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法的某些步骤。 看完定义后,有点烦躁。。上例子!!  相信大家都去过星巴克喝东西吧。有茶,也有咖啡。  那先看看冲咖啡的步骤 ① 把水煮沸② 用沸水冲泡咖啡③ 把咖啡倒进杯子

Xu_Renata的博客 424

设计模式-模板方法模式(TemplateMethod)

模板方法模式是一种行为设计模式,它在一个方法中定义算法的骨架,将一些步骤延迟到子类中实现。 具体来说,模板方法模式的关键特点包括: 抽象类:在抽象类中定义一个模板方法,该方法给出了算法的框架。 具体方法:在抽象类中实现算法中不变的部分,这些方法通常是私有的,以避免子类对其进行修改。 抽象方法:在抽象类中声明一些抽象方法,这些方法是为了在子类中实现特定于子类的步骤。 钩子:可以提供一些默认实现的方法,这些方法通常为空或者包含默认逻辑,子类可以选择性地覆盖这些方法。

m0_51176516的博客 1877

设计模式之建造者模式

  建造者模式又被称为生成器模式,感觉跟模板方法模式有点像,又和抽象工厂模式有点像,对于模板方法而言,它制造出来的子类大多数是一致的,而对于子类需求变化很大的部分,虽然模板方法通过钩子函数能解决,但是如果每个变化都调用一次钩子函数,那也不是个事儿。对于抽象工厂而言,建造者模式返回一个完整的复杂产品,而抽象工厂模式返回一系列相关的产品;在抽象工厂模式中,客户端通过选择具体工厂来生成所需对象,而在建造...

weixin_30699443的博客 59

设计模式——建造者模式_Builder Pattern

建造者模式(或生成器模式)定义: Separate the construction of a complex object from its representation so that the same construction process can create different representations.(将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示

465

设计模式之模板方法模式

抽象模板(Abstract Template):定义一个模板方法,这个模板方法一般是一个具体方法,给出一个顶级算法骨架,而逻辑骨架的组成步骤在相应的抽象操作中,推迟到子类实现。具体模板(Concrete Template):实现父类所定义的一个或多个抽象方法,它们是一个顶级算法逻辑的组成步骤。模板方法模式(Template Method)代码示例,以项目开发上线为例。模板方法模式和建造者模式区别。

2302_76363587的博客 300

php的设计模式,学习php设计模式 php实现建造者模式

这篇文章主要介绍了php设计模式中的建造者模式,使用php实现建造者模式,感兴趣的小伙伴们可以参考一下建造者模式可以让一个产品的内部表象和和产品的生产过程分离开,从而可以生成具有不同内部表象的产品。一、Builder模式结构图二、Builder模式中主要角色抽象建造者(Builder)角色:定义一个抽象接口,规范产品各个组成成分的建造(即规范具体建造者的方法实现)。其中所规范的方法中必须包括建造方...

weixin_36123285的博客 124

设计模式---建造者模式(builder模式)

设计模式: 建造者模式(builder模式)

微不足道的博客 1325

【设计模式】建造者模式(Builder Pattern)

联想:建造模式和 模板方法模式 有相似之处,二者的不同是 模板方法模式 面向方法抽象出各个方法的“壳”,建造者是抽象出 各个部分的“壳”,而内容细节根据建造不同的对象决定。 风机:{变流器(型号:445)、适配器(型号:d200)、散热器(水冷)} 太阳能:{变流器(型号:446)、适配器(型号:d100)、散热器(风冷)} 缺点: 遇见结构框架...

小鱼菜鸟的博客 87

设计模式学习-建造者模式

1.定义 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 2.类图 3.代码示例 1 package com.zhaoyangwoo.builder; 2 3 /** 4 * Created by john on 16/5/7. 5 * 场景类 6 */ 7 public class Builder { 8 9...

weixin_30537391的博客 85

设计模式--建造者(Builder)模式

模式定义 将一个复杂对象的创建与他的表示分离,使得同样的构建过程可以创建不同的表示 类图 应用场景 1.需要生成的对象具有复杂的内部结构; 2.需要生成的对象内部属性本身相互依赖; 3.与不可变对象配合使用; 优点 1.建造者独立,易扩展; 2.便于控制细节风险; 要点总结 Builder模式主要用于“分步骤构建一个复杂的对象”,在这其中“分步骤”是一个稳定的算法,而复杂对象的各个部分则经常变化 变化点在哪里,封装哪里----Builder模式主要在于应对“复杂对象各个部分”的频繁需求变动,其缺点在于难

weixin_38299404的博客 224

十二、java设计模式之模板方法设计模式(行为型设计模式)

模板方法模式Template Method应用场景角色抽象模板(Abstract Template): 定义一个模板方法,这个模板方法一般是一个具体方法,给出一个顶级算法骨架,而逻辑骨架的组成步骤在相应的抽象操作中,推迟到子类实现模板方法:定义了算法的骨架,按某种顺序调用其包含的基本方法基本方法:是整个算法中的一个步骤,包括抽象方法和具体方具体模板(Concrete Template):实现父类所定义的一个或多个抽象方法,它们是一个顶级算法逻辑的组成步骤 编码实战 运行效果 优点提高代码复用性 将相同部

夕颜的博客 202

01-16-15 模板方法模式 - Activity生命周期的模板方法

摘要 模板方法模式是一种行为型设计模式,通过在父类定义算法骨架,将特定步骤延迟到子类实现。Android源码中典型应用包括: Activity生命周期管理:Activity类通过performCreate()等final方法定义流程,onCreate()等protected方法作为子类实现点,确保框架逻辑不被篡改的同时提供定制能力。 View绘制流程:View.draw()方法定义了包含6个固定步骤的绘制算法,其中onDraw()等步骤允许子类覆盖,既保证了绘制顺序又支持自定义绘制内容。 该模式有效解决了代

时代我西的博客 86
上一篇: 深度对比简单工厂模式和策略模式
下一篇: 代理模式和适配器模式区别
越甲八千
博客等级 码龄11年 2959粉丝 553原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值