建造者模式适用于何处
Builder pattern where to apply
您好,我对构建器设计有疑问 pattern.From pluralsight 视频我了解到这种模式用于避免可变 类 中伸缩构造器的复杂性。
其他一些网站将其解释为一种开发或构建复杂对象的方式,方法是将构建器保持为 composition.I 完全 confused.Please 澄清相同?
复杂的构造函数可能对不可变或可变不利类。
大型构造函数(或构造函数的层次结构)的一个问题是您最终可能会得到一个用于多种用途的大型构造函数。例如,如果您正在创建一个全新的对象,某些参数可能是 null
,但当您从其他地方调用它时,它们不能为 null。
弄清楚如何使用这些构造函数很痛苦。即使他们内置了验证,您仍然必须检查您是否以正确的方式创建它。构建器可以有提供提示或强制人们以正确的方式创建它的方法。例如 builder.copy(obj).setName("newObj").build()
。这给出了有关如何复制对象的提示,这可能比通过构造函数查找正确的使用要好。
另一个问题是您必须提供所有必需的构造函数参数。即使有合理的默认值,您也可能被迫提供一些东西。构建器可以包含默认值,因此您只需设置您感兴趣的参数。
另一个问题是一个大的构造函数可能连续有多个相同类型的参数。它要求某人不小心输入错误的值。构建器强制您调用具有有意义名称的方法。
构建器也有静态工厂一样的优势。它可以 return 一个接口而不是具体类型。这很好,因为您鼓励客户 类 针对界面工作。
评论中的链接答案有更多充分的理由。
您好,我对构建器设计有疑问 pattern.From pluralsight 视频我了解到这种模式用于避免可变 类 中伸缩构造器的复杂性。 其他一些网站将其解释为一种开发或构建复杂对象的方式,方法是将构建器保持为 composition.I 完全 confused.Please 澄清相同?
复杂的构造函数可能对不可变或可变不利类。
大型构造函数(或构造函数的层次结构)的一个问题是您最终可能会得到一个用于多种用途的大型构造函数。例如,如果您正在创建一个全新的对象,某些参数可能是 null
,但当您从其他地方调用它时,它们不能为 null。
弄清楚如何使用这些构造函数很痛苦。即使他们内置了验证,您仍然必须检查您是否以正确的方式创建它。构建器可以有提供提示或强制人们以正确的方式创建它的方法。例如 builder.copy(obj).setName("newObj").build()
。这给出了有关如何复制对象的提示,这可能比通过构造函数查找正确的使用要好。
另一个问题是您必须提供所有必需的构造函数参数。即使有合理的默认值,您也可能被迫提供一些东西。构建器可以包含默认值,因此您只需设置您感兴趣的参数。
另一个问题是一个大的构造函数可能连续有多个相同类型的参数。它要求某人不小心输入错误的值。构建器强制您调用具有有意义名称的方法。
构建器也有静态工厂一样的优势。它可以 return 一个接口而不是具体类型。这很好,因为您鼓励客户 类 针对界面工作。
评论中的链接答案有更多充分的理由。