建造者模式和模板方法模式的区别 建造者模式 vs 模板方法模式 核心区别一、一句话本质差异模板方法模式Template Method控制一套固定流程骨架步骤顺序不能改只允许重写内部单个步骤侧重算法流程复用。建造者模式Builder拆分复杂对象的各个部件构造逻辑部件组装顺序可灵活调整最终统一产出完整对象侧重复杂对象分步构建。二、详细对比1. 核心目标不同模板方法目标复用算法流程场景一件事的执行步骤固定只是每一步实现不同例子饮料制作流程固定烧水→加原料→冲泡→装杯茶和咖啡只替换“加原料”步骤顺序永远不变。建造者目标分步组装复杂对象场景对象由多个独立部件组成组装顺序可变、部件可替换最终生成不同成品例子组装电脑CPU、主板、显卡、硬盘是独立部件可以先装主板再装CPU也能调换顺序高配/低配电脑只是部件不同。2. 流程控制权模板方法父类抽象类完全控制流程顺序模板方法定义完整步骤顺序子类只能实现步骤不能修改执行先后。// 父类固定流程publicfinalvoidmakeDrink(){boilWater();// 固定第一步addMaterial();// 子类实现brew();// 固定第三步pour();// 固定第四步}final模板方法防止子类篡改流程。建造者Director指挥组装顺序可灵活更换顺序Builder只负责造单个零件建造者只提供buildCPU()、buildGPU()等单个部件构建方法导演类决定先装哪个甚至可以两套组装逻辑。// 导演控制组装顺序可随意调换publicComputerconstructHighEnd(){builder.buildCPU();builder.buildGPU();builder.buildDisk();returnbuilder.getResult();}publicComputerconstructLowEnd(){builder.buildDisk();builder.buildCPU();// 不造显卡returnbuilder.getResult();}3. 产出物不同模板方法产出执行结果/行为一段流程、一个动作不一定是对象。比如生成文档、制作饮品、游戏角色升级流程。建造者产出复杂复合对象由多个子部件组合而成一定是完整实体对象。比如电脑、房屋、订单、复杂报文。4. 结构组成对比模板方法 组成抽象父类模板方法固定流程 抽象步骤具体子类实现抽象步骤没有分离“构建”和“组装”流程和步骤耦合在一个继承体系建造者 组成抽象Builder定义所有部件构建接口具体Builder实现每个部件怎么造Director专门控制组装顺序可选产品Product最终复杂对象职责彻底拆分造零件的类、组装顺序的类、成品类完全分离5. 拓展方式修改逻辑模板方法只能新增子类重写步骤流程骨架永远不变不适合增减步骤。如果需要新增流程步骤必须修改父类模板方法违反开闭原则。建造者新增部件扩展Builder接口即可更换组装顺序新增Director构造方法不用修改Builder增减部件组装时调用/不调用对应build方法即可扩展性更强三、最直观代码示例区分示例1模板方法固定流程classDrinkTemplate:# 固定流程顺序不可改defmake(self):self.boil_water()self.add_raw()self.brew()self.pour_cup()defboil_water(self):print(烧水)defbrew(self):print(浸泡)defpour_cup(self):print(倒入杯子)# 留给子类实现defadd_raw(self):passclassTea(DrinkTemplate):defadd_raw(self):print(加茶叶)classCoffee(DrinkTemplate):defadd_raw(self):print(加咖啡粉)# 使用流程永远一样Tea().make()Coffee().make()示例2建造者模式组装对象顺序可控# 产品电脑classComputer:def__init__(self):self.cpuself.gpu# 建造者抽象classComputerBuilder:defbuild_cpu(self):passdefbuild_gpu(self):passdefget_pc(self):pass# 具体建造者classGamePCBuilder(ComputerBuilder):def__init__(self):self.pcComputer()defbuild_cpu(self):self.pc.cpui9defbuild_gpu(self):self.pc.gpu4090defget_pc(self):returnself.pc# 导演控制组装顺序classDirector:defbuild_game_pc(self,builder):builder.build_cpu()builder.build_gpu()defbuild_simple_pc(self,builder):# 调换顺序、省略显卡builder.build_gpu()builder.build_cpu()# 使用builderGamePCBuilder()dirDirector()dir.build_game_pc(builder)pcbuilder.get_pc()四、一张总结表对比维度模板方法模式建造者模式核心关注点固定算法流程复用步骤骨架拆分对象部件灵活组装复杂实体步骤顺序父类固定不可修改由Director控制可自由调换/删减产出一段行为/流程执行结果多部件组合的复杂对象类关系依靠继承扩展步骤依靠组合拆分构建与组装逻辑职责拆分流程和步骤都在同一继承树耦合高零件构建、组装顺序、成品完全分离适用场景步骤固定仅内部实现有差异对象结构复杂部件多、组装可变五、快速选型口诀流程顺序固定只是步骤实现不同 → 模板方法要拼一个由多个零件组成的复杂对象组装顺序可改 → 建造者