问题描述
最近,我正在研究设计模式,并且看到了一个称为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 (将#修改为@)