建造者模式(Builder Pattern)是一种创建型设计模式,它可以将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。
建造者模式通常包含四个角色:产品、抽象建造者、具体建造者和指挥者。产品是最终构建出来的对象,抽象建造者定义了构建产品所需的方法,具体建造者实现了抽象建造者的方法,用于构建具体的产品。指挥者负责控制产品的构建过程,它通常接收一个抽象建造者对象作为参数,根据一定的顺序调用抽象建造者的方法来构建产品。
以下是一个使用建造者模式的示例代码:
python
Copy
class Pizza:
def init(self):
self.dough = ""
self.sauce = ""
self.toppings = []
def __str__(self):
return f"Dough: {self.dough}, Sauce: {self.sauce}, Toppings: {', '.join(self.toppings)}"
class PizzaBuilder:
def create_new_pizza(self):
self.pizza = Pizza()
def build_dough(self):
pass
def build_sauce(self):
pass
def build_toppings(self):
pass
def get_pizza(self):
return self.pizza
class MargheritaPizzaBuilder(PizzaBuilder):
def build_dough(self):
self.pizza.dough = "Regular"
def build_sauce(self):
self.pizza.sauce = "Tomato"
def build_toppings(self):
self.pizza.toppings.append("Mozzarella")
self.pizza.toppings.append("Basil")
class HawaiianPizzaBuilder(PizzaBuilder):
def build_dough(self):
self.pizza.dough = "Thin"
def build_sauce(self):
self.pizza.sauce = "Barbecue"
def build_toppings(self):
self.pizza.toppings.append("Ham")
self.pizza.toppings.append("Pineapple")
class Director:
def init(self, builder):
self.builder = builder
def construct_pizza(self):
self.builder.create_new_pizza()
self.builder.build_dough()
self.builder.build_sauce()
self.builder.build_toppings()
pizza_builder1 = MargheritaPizzaBuilder()
pizza_builder2 = HawaiianPizzaBuilder()
director1 = Director(pizza_builder1)
director2 = Director(pizza_builder2)
director1.construct_pizza()
pizza1 = pizza_builder1.get_pizza()
director2.construct_pizza()
pizza2 = pizza_builder2.get_pizza()
print(pizza1) # 输出 "Dough: Regular, Sauce: Tomato, Toppings: Mozzarella, Basil"
print(pizza2) # 输出 "Dough: Thin, Sauce: Barbecue, Toppings: Ham, Pineapple"
在这个示例中,Pizza 是产品,它具有 dough、sauce 和 toppings 属性。PizzaBuilder 是抽象建造者,定义了创建产品所需的方法,包括 create_new_pizza、build_dough、build_sauce、build_toppings 和 get_pizza。MargheritaPizzaBuilder 和 HawaiianPizzaBuilder 是具体建造者,实现了 PizzaBuilder 的方法,用于构建具体的产品。Director 是指挥者,负责控制产品的构建过程。
当客户端调用 Director 的 construct_pizza 方法时,它会根据传入的建造者对象,调用相应的方法来构建产品。
要使用建造者模式,首先需要确定需要创建的复杂对象和复杂对象的构建过程。然后实现一个抽象建造者类,并在其中定义创建产品所需的方法。接着实现一个具体建造者类,并在其中实现抽象建造者类中的方法,用于构建具体的产品。最后实现一个指挥者类,在其中定义一个构建产品的方法,并接收一个抽象建造者对象作为参数,根据一定的顺序调用抽象建造者的方法来构建产品。
意图:将一个复杂的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。
主要解决:主要解决在软件系统中,有时候面临着"一个复杂对象"的创建工作,其通常由各个部分的子对象用一定的算法构成;由于需求的变化,这个复杂对象的各个部分经常面临着剧烈的变化,但是将它们组合在一起的算法却相对稳定。
何时使用:一些基本部件不会变,而其组合经常变化的时候。
如何解决:将变与不变分离开。
关键代码:建造者:创建和提供实例,导演:管理建造出来的实例的依赖关系。
应用实例: 1、去肯德基,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。 2、JAVA 中的 StringBuilder。
优点:
分离构建过程和表示,使得构建过程更加灵活,可以构建不同的表示。
可以更好地控制构建过程,隐藏具体构建细节。
代码复用性高,可以在不同的构建过程中重复使用相同的建造者。
缺点:
如果产品的属性较少,建造者模式可能会导致代码冗余。
建造者模式增加了系统的类和对象数量。
使用场景: 1、需要生成的对象具有复杂的内部结构。 2、需要生成的对象内部属性本身相互依赖。
建造者模式在创建复杂对象时非常有用,特别是当对象的构建过程涉及多个步骤或参数时。它可以提供更好的灵活性和可维护性,同时使得代码更加清晰可读。
注意事项:与工厂模式的区别是:建造者模式更加关注与零件装配的顺序。
《Head First 设计模式》第 4 章:工厂模式。这本书是一本很好的学习设计模式的入门书籍,适合初学者阅读。
《设计模式:可复用面向对象软件的基础》。这是一本经典的设计模式书籍,其中详细介绍了建造者模式以及其他 22 种设计模式。
《大话设计模式》第 8 章:建造者模式。这本书通过生动的故事情节和通俗易懂的语言介绍了各种设计模式,适合初学者阅读。
设计模式视频教程。有很多优秀的设计模式视频教程,可以通过观看视频来更好地理解建造者模式和其他设计模式。
GitHub 上的设计模式示例代码。可以通过查看其他开发者编写的示例代码来学习建造者模式的具体实现方式。