生成器设计模式与使用从其他继承的类有什么区别?

问题描述

最近,我正在研究设计模式,并且看到了一个称为builder的模式,该模式在理论上应该封装类的复杂性,这是我一直在练习的示例:

class ExampleBuilder
{
    static void Main(string[] args)
    {
        Kitchen kit = new Kitchen();

        // One pizza 
        kit.NextPizza(new FourCheeseBuilder("Family"));
        kit.PreparePizza();
        var FourCheesePizza = kit.PizzaComplete;

        // Another pizza
        kit.NextPizza(new HawaiianBuilder("Small"));
        kit.PreparePizza();
        var HawaiianPizza = kit.PizzaComplete;
    }
}

// Final Product
public class Pizza
{
    public string Dough { get; set; }
    public string Sauce { get; set; }
    public string Stuff { get; set; }
    public string Size { get; set; }
    public bool BeenFolded { get; set; }

    public Pizza()
    {

    }

    public Pizza(string Size,string Dough,string Sauce,string Stuff,bool BeenFolded) : this()
    {
        this.Size = Size;
        this.Dough = Dough;
        this.Sauce = Sauce;
        this.Stuff = Stuff;
        this.BeenFolded = BeenFolded;
    }
}

// Builder
public abstract class PizzaBuilder
{
    // Protected para que las clases que implementen puedan acceder
    protected Pizza _pizza;
    public string Size { get; set; }

    public Pizza ObtainPizza() { return _pizza; }



    // Un paso para cada una de las propiedades
    public virtual void PrepareDough()
    {

    }

    public virtual void PrepareSauce()
    {

    }

    public virtual void PrepareStuff()
    {

    }

    public virtual void FoldPizza()
    {

    }

}

// BuilderConcrete
public class HawaiianBuilder : PizzaBuilder
{
    public HawaiianBuilder(string size)
    {
        _pizza = new Pizza
        {
            Size = size
        };
    }
    public override void PrepareDough()
    {
        _pizza.Dough = "Soft";
    }

    public override void PrepareSauce()
    {
        _pizza.Sauce = "Sweet";
    }

    public override void PrepareStuff()
    {
        _pizza.Stuff = "pineapple,tomato,ham";
    }
}

// Another BuilderConcrete
public class FourCheeseBuilder : PizzaBuilder
{
    public FourCheeseBuilder(string size)
    {
        _pizza = new Pizza
        {
            Size = size
        };
    }
    public override void PrepareDough()
    {
        _pizza.Dough = "Coocked";
    }

    public override void PrepareSauce()
    {
        _pizza.Sauce = "Roquefort";
    }

    public override void PrepareStuff()
    {
        _pizza.Stuff = "mozzarela,gorgonzola,parmesano,ricotta";
    }
}

// Director
public class Kitchen
{
    private PizzaBuilder _pizzaBuilder;

    public void NextPizza(PizzaBuilder pizzaBuilder)
    {
        _pizzaBuilder = pizzaBuilder;
    }

    public void PreparePizza()
    {
        _pizzaBuilder.PrepareDough();
        _pizzaBuilder.PrepareSauce();
        _pizzaBuilder.PrepareStuff();
    }

    public Pizza PizzaComplete
    {
        get { return _pizzaBuilder.ObtainPizza(); }

    }
}

我必须做所有的事情来定义两种类型的不同类,而且我不明白为什么这些比这样做更好:

 class ExampleBuilder
{
    static void Main(string[] args)
    {

        //One Pizza
        var FourCheesePizza2 = new FourCheese2("Family");

        //Another Pizza
        var HawaiianPizza2 = new HawaiianPizza2("Small");
    }
}

// Final product
public abstract class Pizza2
{
    public string Dough { get; set; }
    public string Sauce { get; set; }
    public string Stuff { get; set; }
    public string Size { get; set; }
    public bool BeenFolded { get; set; }

    public Pizza2()
    {

    }

    public Pizza2(string Size,bool BeenFolded) : this()
    {
        this.Size = Size;
        this.Dough = Dough;
        this.Sauce = Sauce;
        this.Stuff = Stuff;
        this.BeenFolded = BeenFolded;
    }
}

public class HawaiianPizza2 : Pizza2
{
    public HawaiianPizza2(string size)
    {
        Size = size;
        Dough = "Soft";
        Sauce = "Sweet";
        Stuff = "pineapple,ham";
        BeenFolded = false;
    }
}

public class FourCheese2 : Pizza2
{
    public FourCheese2(string size)
    {
        Size = size;
        Dough = "Coocked";
        Sauce = "Roquefort";
        Stuff = "mozzarela,ricotta";
        BeenFolded = true;
    }
}

我得到相同的结果,但是占用的代码行少得多,这就是为什么我不知道模式构建器真正用于什么的原因。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)