采用以下经典工厂模式:
public interface IPizza
{
decimal Price { get; }
}
public class HamAndMushroomPizza : IPizza
{
decimal IPizza.Price
{
get
{
return 8.5m;
}
}
}
public abstract class PizzaFactory
{
public abstract IPizza CreatePizza(ItalianPizzaFactory.PizzaType pizzaType);
}
public class ItalianPizzaFactory : PizzaFactory
{
public enum PizzaType
{
HamMushroom,
Deluxe,
Hawaiian
}
public override IPizza CreatePizza(PizzaType pizzaType)
{
switch (pizzaType)
{
case PizzaType.HamMushroom:
return new HamAndMushroomPizza();
case PizzaType.Hawaiian:
return new HawaiianPizza();
default:
throw new ArgumentException("The pizza type " + pizzaType + " is not recognized.");
}
}
}
如果一个(或多个)混凝土披萨需要特定于施工时具体实施的参数怎么办?例如,假设 HamAndMushroom 工厂需要一个名为 MushroomType 的参数,并且需要此参数来实例化该对象吗?
您可以将参数添加到工厂的创建者方法中。然而,如果参数的数量越来越多(对我来说会超过 2-3 个),特别是如果这些参数中的一些或全部是可选的,并且具有合理的默认值,那么您可以考虑将工厂变成一个Builder http://en.wikipedia.org/wiki/Builder_pattern反而。
这可能特别适合披萨,通常有相同的外壳,只是有不同的配料(组合)。构建器非常接近常见的订购方式,例如“带有萨拉米香肠、西红柿、玉米和双层奶酪的披萨”。 OTOH 对于“预定义”披萨,您可能需要定义辅助工厂方法,例如createMargaritaPizza
or createHawaiiPizza
然后在内部使用构建器创建一个带有特定于该类型披萨的配料的披萨。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)