我的实现是否违反构建器模式?
Is my implementation against the builder pattern?
我的示例代码:
class CitiesListBuilder{
private List<String> cities;
public static CitiesListBuilder newBuilder(){
return new CitiesListBuilder();
}
private CitiesListBuilder(){
cities = new ArrayList<>();
}
public CitiesListBuilder addCity(String city) {
cities.add(city);
return this;
}
public CitiesListBuilder apply(Function<List<String>, List<String>> filter) {
cities = cities.apply(filter);
return this;
}
public List<String> build(){
return cities;
}
}
使用:
CitiesListBuilder.newBuilder
.addCity("LA")
.addCity("NY")
.apply(NorthCitiesFilterFunction)
.build();
我知道我的代码可能是使用构建器模式的糟糕示例,但对我来说它使代码更短更清晰(我自己的意见),而且我没有发现任何并发问题。
但是根据您的意见,如果我 should/should 不执行这样的代码会有什么争论?
谢谢。
构建器模式的目的是为具有相同接口的多个构建器提供抽象,以便以相同的方式创建产品对象,即使它们的类型不同(产品对象可以实现相同的接口或有共同的祖先)和参数。如果您只需要使用一种类型的构建器来创建一种类型的对象,那只会让事情过于复杂。
我有点不愿意把这个叫做"Builder"模式。这不完全是 GoF Builder Pattern 正在做的事情。所以,如果你要求 GoF Builder 模式,那么你写的几乎所有内容都不符合 Builder 模式,因为你写的根本不相关。
但是,我们通常将您正在做的事情称为 "Fluent Builder"(或 Fluent Interface)。关于什么是 Fluent Builder 从来没有一个明确的定义,除了它提供了一个流畅的界面并帮助您创建一些东西。一个有趣的例子是,在 Apache Commons Lang 中,你会发现像 EqualsBuilder
、HashCodeBuilder
和 CompareToBuilder
这样的东西,它们提供了流畅的界面,让你提供数据来得出最终结果.由于"Fluent Builder"的含义没有明确的定义,因此我们无法评论它是否是"against"模式。
这绝对不是规范的构建器。您的 class 似乎在用字符串填充列表,过滤它们然后返回该列表。 Plus builder 应该总是使用 'return this' 而你不会。另外,您的构建器会在开始时自行初始化,这也是不好的做法并且令人困惑
是否"against"构建器模式并不重要。
but to me it makes the code shorter and more clear
这才是最重要的。如果您是为自己编写代码,那么 only 才是最重要的。如果您希望与其他人协作,那么如果它也能让您的同事更清楚地了解代码,那将会有所帮助。
您的 class 是一种您认为可用于构建城市列表的工具。 CitiesListBuilder
听起来是个不错的名字。如果它构建了一个名为 CitiesList
的 class,那将是更多的构建器,但也许你不需要那个...
...还.
我的示例代码:
class CitiesListBuilder{
private List<String> cities;
public static CitiesListBuilder newBuilder(){
return new CitiesListBuilder();
}
private CitiesListBuilder(){
cities = new ArrayList<>();
}
public CitiesListBuilder addCity(String city) {
cities.add(city);
return this;
}
public CitiesListBuilder apply(Function<List<String>, List<String>> filter) {
cities = cities.apply(filter);
return this;
}
public List<String> build(){
return cities;
}
}
使用:
CitiesListBuilder.newBuilder
.addCity("LA")
.addCity("NY")
.apply(NorthCitiesFilterFunction)
.build();
我知道我的代码可能是使用构建器模式的糟糕示例,但对我来说它使代码更短更清晰(我自己的意见),而且我没有发现任何并发问题。
但是根据您的意见,如果我 should/should 不执行这样的代码会有什么争论?
谢谢。
构建器模式的目的是为具有相同接口的多个构建器提供抽象,以便以相同的方式创建产品对象,即使它们的类型不同(产品对象可以实现相同的接口或有共同的祖先)和参数。如果您只需要使用一种类型的构建器来创建一种类型的对象,那只会让事情过于复杂。
我有点不愿意把这个叫做"Builder"模式。这不完全是 GoF Builder Pattern 正在做的事情。所以,如果你要求 GoF Builder 模式,那么你写的几乎所有内容都不符合 Builder 模式,因为你写的根本不相关。
但是,我们通常将您正在做的事情称为 "Fluent Builder"(或 Fluent Interface)。关于什么是 Fluent Builder 从来没有一个明确的定义,除了它提供了一个流畅的界面并帮助您创建一些东西。一个有趣的例子是,在 Apache Commons Lang 中,你会发现像 EqualsBuilder
、HashCodeBuilder
和 CompareToBuilder
这样的东西,它们提供了流畅的界面,让你提供数据来得出最终结果.由于"Fluent Builder"的含义没有明确的定义,因此我们无法评论它是否是"against"模式。
这绝对不是规范的构建器。您的 class 似乎在用字符串填充列表,过滤它们然后返回该列表。 Plus builder 应该总是使用 'return this' 而你不会。另外,您的构建器会在开始时自行初始化,这也是不好的做法并且令人困惑
是否"against"构建器模式并不重要。
but to me it makes the code shorter and more clear
这才是最重要的。如果您是为自己编写代码,那么 only 才是最重要的。如果您希望与其他人协作,那么如果它也能让您的同事更清楚地了解代码,那将会有所帮助。
您的 class 是一种您认为可用于构建城市列表的工具。 CitiesListBuilder
听起来是个不错的名字。如果它构建了一个名为 CitiesList
的 class,那将是更多的构建器,但也许你不需要那个...
...还.