工厂如何以抽象工厂模式访问其他工厂的产品

http://img4.mukewang.com/60837e1f000195f207830760.jpg

在此示例中,对于NYPizzaIngredientFactory,他们只能使用ThinCrustDough制作披萨。我如何制作可以使用其他工厂的食材的比萨饼,例如ChicagoPizzaIngredientFactory的ThickCrustDough。我想尝试远离构建器,并坚持使用抽象的工厂模式和工厂方法。


动漫人物
浏览 162回答 2
2回答

白板的微信

你NYPizzaStore将不得不使用的ChicagoPizzaIngredientFactory,如果你希望它能够使用ThickCrustDough。但是,如果您考虑这种做法的实用性,让他们向您运送芝加哥的食材可能就没有意义了。在我看来,您有两种选择:在纽约设有另一家可以生产浓面团的工厂(例如NYThickPizzaIngredientFactory)。这是因为您的界面只有一个createDough不带参数的方法,因此您无法告诉它要制作哪种面团。它只能使一个。更改您的界面,使该createDough方法接受可以告诉工厂要制造哪种面团的参数。这是我推荐的。参数的类型也可以基于特定的工厂。例如://TDoughArts tells you what type of arguments the factory needs in order to make dough.public interface IPizzaIngredientFactory<TDoughArgs> where TDoughArgs : IDoughArgs&nbsp; &nbsp; &nbsp;&nbsp;{&nbsp; &nbsp; //....&nbsp; &nbsp; IDough CreateDough(TDoughArgs doughArgs);&nbsp; &nbsp; //....}public interface IDoughArgs{}public class NYPizzaDoughArgs : IDoughArgs{&nbsp; &nbsp; public enum DoughTypes&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Thin = 0,&nbsp; &nbsp; &nbsp; &nbsp; Thick = 1&nbsp; &nbsp; }&nbsp; &nbsp; public DoughTypes DoughType { get; set; }}public class NYPizzaIngredientFactory : IPizzaIngredientFactory<NYPizzaDoughArgs>{&nbsp; &nbsp; //....&nbsp; &nbsp; public IDough CreateDough(NYPizzaDoughArgs doughArgs)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; //Make the right dough based on args here&nbsp; &nbsp; &nbsp; &nbsp; if(doughArgs.DoughType == DoughTypes.Thin)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //...&nbsp; &nbsp; }&nbsp; &nbsp; //....}我在几分钟内就提出来了,因此请检查一致性,但是我想您会明白的。您不必使用泛型。IDoughArgs如果您不想获得更多的特异性,则可以坚持使用该界面。用法:var factory = new NYPizzaIngredientFactory();var args = new NYPizzaDoughArgs();args.DoughType = NYPizzaDoughArgs.DoughTypes.Thick;var dough = factory.createDough(args);
打开App,查看更多内容
随时随地看视频慕课网APP