Builder设计模式和Factory设计模式有什么不同?
哪一个更有优势?为什么?
如果我想测试和比较/对比这些模式,我如何将我的发现表示为图形?
发布于 2009-04-16 11:46:53
对于设计模式,通常没有适用于所有情况的“更有利”的解决方案。这取决于您需要实现什么。
来自维基百科:
中使用单例
工厂设计模式的维基百科词条:http://en.wikipedia.org/wiki/Factory_method_pattern
构建器设计模式的维基百科条目:http://en.wikipedia.org/wiki/Builder_pattern
发布于 2012-01-22 05:15:43
工厂只是一个围绕构造函数的包装函数(可能在不同的类中)。关键区别在于,工厂方法模式要求在单个方法调用中构建整个对象,所有参数都在一行中传递。将返回最终的对象。
另一方面,构建器模式本质上是一个包装对象,它包含了您可能想要传递到构造函数调用中的所有可能的参数。这允许您使用setter方法来慢慢构建参数列表。构建器类上的另一个方法是build()方法,它只是将构建器对象传递给所需的构造函数,并返回结果。
在像Java这样的静态语言中,当您有大量(可能是可选的)参数时,这就变得更加重要,因为它避免了对所有可能的参数组合使用伸缩构造函数的要求。此外,构建器还允许您使用setter方法来定义只读或私有字段,这些字段在调用构造函数后不能直接修改。
Basic工厂示例
// Factory
static class FruitFactory {
static Fruit create(name, color, firmness) {
// Additional logic
return new Fruit(name, color, firmness);
}
}
// Usage
Fruit fruit = FruitFactory.create("apple", "red", "crunchy");
Basic生成器示例
// Builder
class FruitBuilder {
String name, color, firmness;
FruitBuilder setName(name) { this.name = name; return this; }
FruitBuilder setColor(color) { this.color = color; return this; }
FruitBuilder setFirmness(firmness) { this.firmness = firmness; return this; }
Fruit build() {
return new Fruit(this); // Pass in the builder
}
}
// Usage
Fruit fruit = new FruitBuilder()
.setName("apple")
.setColor("red")
.setFirmness("crunchy")
.build();
比较这两个维基百科页面中的代码样本可能是值得的:
发布于 2009-04-16 11:44:50
工厂模式几乎可以看作是Builder模式的简化版本。
在工厂模式中,工厂负责根据需要创建对象的各种子类型。
工厂方法的用户不需要知道该对象的确切的子类型。工厂方法createCar
的一个示例可能返回Ford
或Honda
类型的对象。
在构建器模式中,不同的子类型也是由构建器方法创建的,但是在同一子类中对象的组成可能不同。
要继续汽车示例,可以使用createCar
构建器方法创建具有4个气缸的引擎的Honda
-typed对象,或创建具有6个气缸的Honda
-typed对象。构建器模式允许这种更精细的粒度。
维基百科上提供了Builder pattern和Factory method pattern的图表。
https://stackoverflow.com/questions/757743
复制