这个类是Builder还是Factory设计模式的一个例子?



我正在学习设计模式!我对它遵循的是哪种设计模式有点困惑。将这个类命名为PizzaFactory或PizzaBuilder会更合适吗?你能解释一下原因吗?

下面是类:

public class PizzaCreator
{
public CrustFactory? crustFactory;
private SauceFactory? sauceFactory;
private CheeseFactory? cheeseFactory;
public Pizza CreatePizza()
{
Crust? crust = crustFactory?.CreateCrust();
Sauce? sauce = sauceFactory?.CreateSauce();
Cheese? cheese = cheeseFactory?.CreateCheese();
return new Pizza(crust, sauce, cheese);
}
public PizzaCreator SetCrustFactory(CrustFactory crustFactory)
{
this.crustFactory = crustFactory;
return this;
}
public PizzaCreator SetSauceFactory(SauceFactory sauceFactory)
{
this.sauceFactory = sauceFactory;
return this;
}
public PizzaCreator SetCheeseFactory(CheeseFactory cheeseFactory)
{
this.cheeseFactory = cheeseFactory;
return this;
}
}

从表面上看,使用类时pizza的创建对我来说就像构建器模式

public Pizza CreateCheesePizza(PizzaCreator pizzaCreator)
{
return pizzaCreator
.SetCrustFactory(new ThinCrustFactory())
.SetSauceFactory(new TomatoSauceFactory())
.SetCheeseFactory(new MozzarellaCheese())
.CreatePizza();
}

但是我觉得在类里面,它看起来更像工厂模式,因为setter实际上并没有构建任何东西,只是设置工厂依赖。create方法然后完成所有的构建。

这是什么?构建器类还是工厂类?谢谢你!

首先,设计模式只是工具。并不是所有看起来像设计模式的东西都必须自动成为设计模式。

话虽这么说,我想说你的PizzaCreator是一个工厂,包括一个流畅的API来配置它。

构建器通常具有设置对象的实际(未来)属性的方法,但在您的示例中,您正在设置用于创建用于这些对象的对象的工厂。

最后,您有一个工厂,其中CreatePizza()创建Pizza对象,其他方法只是配置如何在CreatePizza()被调用时创建该对象。

然而,我承认这是一个界限变得模糊的点。你并不总是有精确的设计模式可以遵循,你应该使用在你的用例中最有意义和最有效的设计模式。

甚至可以说,builder通常只是一个特殊的工厂。

另外,我想说PizzaCreator这个名字是非常好的,因为它介于工厂和建筑商之间,而这个名字既没有暗示这两者。但是命名是非常主观的。