模板模式 VS 建造者模式
模板模式和建造者模式是两种不同的设计模式,下面从定义、结构、应用场景等方面介绍它们的区别,并给出 Python 示例代码。
定义
- 模板模式:定义了一个操作中的算法骨架,将一些步骤的实现延迟到子类中。这样,子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
- 建造者模式:将一个复杂对象的构建与表示分离,使得同样的构建过程可以创建不同的表示。它允许你逐步构建一个复杂对象,而不是一次性创建它。
结构与角色
- 模板模式
- 抽象类:定义了算法的骨架,包含一些抽象方法和具体方法。抽象方法需要在子类中实现,具体方法则提供了默认的实现。
- 具体子类:继承抽象类,实现抽象方法,完成算法中特定步骤的具体实现。
- 建造者模式
- 抽象建造者:定义了创建产品各个部分的抽象方法。
- 具体建造者:实现抽象建造者的方法,构建和装配产品的各个部分。
- 指挥者:负责调用建造者的方法来构建产品。
- 产品:被构建的复杂对象。
适用场景
- 模板模式
- 多个子类有公共的方法,并且逻辑基本相同时。
- 重要、复杂的算法,可以把核心算法设计为模板方法,周边的相关细节功能由各个子类实现。
- 重构时,模板方法模式是一个经常使用的模式,把相同的代码抽取到父类中,然后通过钩子函数约束其行为。
- 建造者模式
- 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时。
- 当构造过程必须允许被构造的对象有不同表示时。
Python 示例代码
模板模式示例
AbstractClass
作为抽象类定义算法骨架template_method
,含默认step2
及待实现的step1
、step3
。ConcreteClass1
和ConcreteClass2
继承该抽象类,实现各自的step1
和step3
。- 主程序创建这两个子类的实例并调用
template_method
。 - 按既定骨架执行不同子类的自定义步骤,实现算法复用与扩展。
# 抽象类
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()
建造者模式示例
想象你要组装一台电脑:
- 你可以选择不同的CPU、内存、硬盘、显卡等
- 组装步骤是固定的(先装主板,再装CPU,然后内存...)
- 但每个步骤的具体实现可以不同
建造者模式就是把"组装过程"和"具体零件"分离,这样你可以用相同的组装过程创建不同的电脑配置。
# 产品类 - 最终要构建的复杂对象
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)
总结
- 模板模式主要关注的是算法的骨架,将一些步骤的实现延迟到子类中,强调的是算法的复用和扩展。
- 建造者模式主要关注的是复杂对象的构建过程,将构建和表示分离,强调的是对象构建过程的灵活性和可配置性。