Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中的“Builder”设计模式是否过时了?_Python_Design Patterns_Builder - Fatal编程技术网

Python中的“Builder”设计模式是否过时了?

Python中的“Builder”设计模式是否过时了?,python,design-patterns,builder,Python,Design Patterns,Builder,我正在通读,他们提出了一个论点,即构建器模式在Java中是相关的,因为它允许以下代码: CarBuilder carBuilder = new CarBuilder() carBuilder.setSeats(2) carBuilder.setSportsCar(true) carBuilder.setTripComputer(true) carBuilder.setGPS(false) Car car = carBuilder.build() 与更容易混淆的形式相比: Car car = n

我正在通读,他们提出了一个论点,即构建器模式在Java中是相关的,因为它允许以下代码:

CarBuilder carBuilder = new CarBuilder()
carBuilder.setSeats(2)
carBuilder.setSportsCar(true)
carBuilder.setTripComputer(true)
carBuilder.setGPS(false)
Car car = carBuilder.build()
与更容易混淆的形式相比:

Car car = new Car(2, true, true, false)
他们后来说:

在Scala这样的语言中,可以在传递参数时命名参数 在他们看来,构建器模式大多已经过时


对于Python来说,这是一种类似的情况,因为您可以在任何调用中命名关键字参数,还是这种设计模式有一些合理的应用程序

作为一名Scala程序员,我认为情况就是这样。我实现了一个API,其中Java代码使用“构建器”,而Scala代码只是普通的Scala代码。我相信在Python中也可以做到这一点,没有任何阻碍,并且使用构建器模式并不是严格要求的行为。命名参数的工作方式更好,可读性更高,通常会产生更干净的解决方案。

一本权威的答案可以在高效Java一书中找到。 第2章是Josh Bloch著名的Java Builder模式的起源。 在第15页,它说

生成器模式模拟Ada和Python中的命名可选参数

所以你的问题的答案是肯定的。不需要模拟语言中固有的模式


您可能还对这个流行的线程感兴趣:

您可以在
build()
ing之前传递一个构建器,在不同的时间和位置执行初始化的不同方面。此外,如何创建一个对象可能涉及到复杂的逻辑,甚至是哪一个Fluent的api通常只能通过构建器模式实现。