我知道并且经常使用经典的“构建器”设计模式,其中描述了here。 但是,我现在有一个案例,我想使用类似Builder的模式,但在这种特殊情况下,我不必在我的“Builder”中设置任何参数,因为“Builder”使用的所有值都是是常量,不必动态设置。 我现在将“Builder”实现为经典的Builder,就像这样(代码简化了):
final class MyBuilder {
private static final String FOO = "foo";
private static final String BAR = "bar";
private List<MyResult> results = new ArrayList<>();
MyBuilder() {
// empty constructor
}
List<MyResult> build() {
results.add(createFoo());
results.add(createBar());
return results;
}
private MyResult createFoo() {
...
}
private MyResult createBar() {
...
}
...
}
此构建器的使用方式如下:
MyBuilder resultsBuilder = new MyBuilder();
List<MyResult> results = resultsBuilder.build();
或者可以像这样使用:
List<MyResult> results = new MyBuilder().build();
由于与经典构建器不同,这个特定的“构建器”不期望任何输入参数(不需要调用构建器的setter),它可以提供一个静态方法,它将创建它的实例和返回最终结果,以便可以像这样使用构建器:
List<MyResult> results = MyBuilder.build();
在这种情况下,“builder”可能包含以下代码(build()方法是静态的):
final class MyBuilder {
private static final String FOO = "foo";
private static final String BAR = "bar";
private List<MyResult> results = new ArrayList<>();
private MyBuilder() {
// hidden constructor
}
static List<MyResult> build() {
MyBuilder builder = new MyBuilder();
return builder.build();
}
private List<MyResult> buildResults() {
results.add(createFoo());
results.add(createBar());
return results;
}
private MyResult createFoo() {
...
}
private MyResult createBar() {
...
}
...
}
它还是生成器吗?在您看来,对Builder模式的这种修改是否正常? 是否存在可能更适合这种特殊情况的不同设计模式?
我读过关于factory method pattern的内容,但我得出的结论是我的案例不是工厂方法模式,因为它不使用多态。见上述文章的第一句:
“在基于类的编程中,工厂方法模式是一个 创建模式,使用工厂方法来处理问题 创建对象而不指定确切的对象类 将被创建。“
我指定将由静态方法创建的对象的确切类。另见上述文章中的定义章节:
“工厂方法模式不应与更多混淆 工厂和工厂方法的一般概念。工厂方法 模式是最着名的工厂和工厂方法的使用,但 并非所有工厂方法的使用都是工厂方法的例子 模式 - 仅在涉及继承时(实现一个类的类) 接口,或派生类,实现工厂方法)是它 工厂方法模式的示例。工厂的更基本用途 不是工厂方法模式的示例,而是可以是 简称工厂模式或简单工厂;这些是 在factory讨论过。“
所以也许这是一个简单的工厂(不要与factory method pattern混淆)?你怎么看待这件事?
如何调用“MyBuilder”类(其中“My”是业务特定名称的占位符)?也许MyFactory?
答案 0 :(得分:1)
它不是builder我不认为它只是一种工厂方法,即生产固定物体的方法。
构建器允许您在构建对象之前指定要构建的对象的选项,以便可以更改构建的实例。工厂方法在调用时只生成对象的实例,并且通常是静态的。
您可以考虑一种方法,其中构建器类使用静态方法返回默认构建器实例,该实例具有许多预先配置的选项,然后您可以进一步修改这些选项。但是如果你总是想要返回相同的对象,那么你的工厂方法就可以了。