2026/1/9 9:18:31
网站建设
项目流程
在discuz做网站,店铺图片设计,企业网站硬件建设方案,网站代码大全Python 中的建造者模式#xff08;Builder Pattern#xff09;
建造者模式是一种创建型设计模式#xff0c;用于将一个复杂对象的构建过程与其表示分离#xff0c;使得同样的构建过程可以创建不同的表示。
核心目的#xff1a; 当一个对象有许多可选参数、配置项#x…Python 中的建造者模式Builder Pattern建造者模式是一种创建型设计模式用于将一个复杂对象的构建过程与其表示分离使得同样的构建过程可以创建不同的表示。核心目的当一个对象有许多可选参数、配置项或者构建步骤复杂时使用建造者模式可以让代码更清晰、可读性更高避免出现“ telescoping constructor”超长构造函数问题。典型应用场景创建复杂对象如 HTML、SQL 查询、配置文件、Pizza、电脑配置等需要一步步配置对象的属性同一个构建过程需要产生不同配置的对象构建过程必须保持稳定但最终产品有多种变体建造者模式 vs 工厂模式工厂模式关注“创建什么对象”建造者模式关注“如何一步步构建一个复杂对象”Python 实现示例定制 Pizza我们用一个经典例子——定制披萨来演示建造者模式。fromabcimportABC,abstractmethodfromtypingimportList# 最终产品PizzaclassPizza:def__init__(self):self.size:strself.crust:strself.sauce:strself.cheese:strself.toppings:List[str][]def__str__(self):returnf Pizza: Size:{self.size}Crust:{self.crust}Sauce:{self.sauce}Cheese:{self.cheese}Toppings:{, .join(self.toppings)orNone}.strip()# 抽象建造者classPizzaBuilder(ABC):abstractmethoddefset_size(self,size:str):passabstractmethoddefset_crust(self,crust:str):passabstractmethoddefset_sauce(self,sauce:str):passabstractmethoddefadd_cheese(self,cheese:str):passabstractmethoddefadd_topping(self,topping:str):passabstractmethoddefget_pizza(self)-Pizza:pass# 具体建造者Margherita Pizza BuilderclassMargheritaPizzaBuilder(PizzaBuilder):def__init__(self):self.pizzaPizza()defset_size(self,size:str):self.pizza.sizesizereturnself# 支持链式调用defset_crust(self,crust:str):self.pizza.crustcrustreturnselfdefset_sauce(self,sauce:str):self.pizza.sauceTomato# Margherita 固定番茄酱returnselfdefadd_cheese(self,cheese:str):self.pizza.cheeseMozzarellareturnselfdefadd_topping(self,topping:str):iftopping.lower()basil:self.pizza.toppings.append(topping)returnselfdefget_pizza(self)-Pizza:returnself.pizza# 具体建造者Pepperoni Pizza BuilderclassPepperoniPizzaBuilder(PizzaBuilder):def__init__(self):self.pizzaPizza()defset_size(self,size:str):self.pizza.sizesizereturnselfdefset_crust(self,crust:str):self.pizza.crustcrustreturnselfdefset_sauce(self,sauce:str):self.pizza.saucesaucereturnselfdefadd_cheese(self,cheese:str):self.pizza.cheesecheesereturnselfdefadd_topping(self,topping:str):self.pizza.toppings.append(topping)returnselfdefget_pizza(self)-Pizza:returnself.pizza# 指挥者Director可选用于定义构建顺序classPizzaChef:def__init__(self,builder:PizzaBuilder):self.builderbuilderdefmake_pizza(self,size:str):return(self.builder.set_size(size).set_crust(Thin).set_sauce(Tomato).add_cheese(Mozzarella).get_pizza())# 使用示例if__name____main__:# 方式1使用指挥者标准流程margherita_builderMargheritaPizzaBuilder()chefPizzaChef(margherita_builder)pizza1chef.make_pizza(Large)pizza1.toppings.append(Basil)# 额外添加print(pizza1)# 方式2手动链式构建更灵活Python 中常见pepperoni_builderPepperoniPizzaBuilder()pizza2(pepperoni_builder.set_size(Medium).set_crust(Stuffed).set_sauce(Spicy Tomato).add_cheese(Cheddar).add_topping(Pepperoni).add_topping(Mushrooms).add_topping(Olives).get_pizza())print(pizza2)Python 中的简化版更 PythonicPython 支持链式调用返回 self和默认参数因此可以实现更简洁的建造者classPizza:def__init__(self,sizeMedium):self.sizesize self.crustClassicself.sauceTomatoself.cheeseMozzarellaself.toppings[]defset_crust(self,crust):self.crustcrustreturnselfdefset_sauce(self,sauce):self.saucesaucereturnselfdefadd_topping(self,topping):self.toppings.append(topping)returnselfdef__str__(self):returnf{self.size}{self.crust}pizza with{self.sauce},{self.cheese}, toppings:{self.toppings}# 直接使用无需额外 Builder 类pizza(Pizza(Large).set_crust(Thin).set_sauce(BBQ).add_topping(Chicken).add_topping(Onions))print(pizza)这种方式在 Python 社区更常见因为简洁且易读。建造者模式结构总结角色职责Product复杂对象PizzaBuilder抽象接口定义构建步骤ConcreteBuilder实现具体构建逻辑返回产品Director可选编排构建顺序优点构建过程与表示分离一步步构建代码可读性高支持链式调用Fluent Interface易于扩展新产品类型缺点如果产品简单引入建造者会过度设计需要更多类实际推荐Python 项目中对象参数不多直接用默认参数 可选参数参数中等5-10个用链式方法Fluent Builder参数很多或构建复杂使用完整建造者模式 Director如果你想看其他例子如构建 SQL 查询、HTML 字符串、DataFrame 配置、游戏角色创建等欢迎告诉我