工厂模式但具有对象参数

gua*_*azz 21 c# design-patterns factory-pattern

采用以下经典工厂模式:

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.");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果一个(或多个)混凝土比萨饼需要特定于施工中具体实施的参数,该怎么办?例如,假设HamAndMushroom工厂需要一个名为MushroomType的参数,并且需要此参数来实例化对象?

Pét*_*rök 20

您可以将参数添加到工厂的创建者方法中.但是,如果参数的数量越来越多(对于我来说,这将超过2-3),特别是如果这些参数中的部分或全部是可选的,并且具有合理的默认值,您可以考虑将工厂改为生成器.

这可能特别适合比萨饼,在那里你通常有相同的外壳,只有不同(组合)的浇头.建筑师非常接近常见的订购方式,例如"萨拉米香肠,西红柿,玉米和双层奶酪".OTOH用于"预定义"比萨,你可能想要定义辅助工厂方法,例如,createMargaritaPizza或者createHawaiiPizza然后在内部使用构建器来创建具有特定于那种披萨的浇头的披萨.

  • 你们让我饿了:) (9认同)