为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
动漫人物 2021-04-10 09:11:17
在此示例中,对于NYPizzaIngredientFactory,他们只能使用ThinCrustDough制作披萨。我如何制作可以使用其他工厂的食材的比萨饼,例如ChicagoPizzaIngredientFactory的ThickCrustDough。我想尝试远离构建器,并坚持使用抽象的工厂模式和工厂方法。
查看完整描述

2 回答

?
白板的微信

TA贡献1883条经验 获得超3个赞

NYPizzaStore将不得不使用的ChicagoPizzaIngredientFactory,如果你希望它能够使用ThickCrustDough

但是,如果您考虑这种做法的实用性,让他们向您运送芝加哥的食材可能就没有意义了。

在我看来,您有两种选择:

  1. 在纽约设有另一家可以生产浓面团的工厂(例如NYThickPizzaIngredientFactory)。这是因为您的界面只有一个createDough不带参数的方法,因此您无法告诉它要制作哪种面团。它只能使一个。

  2. 更改您的界面,使该createDough方法接受可以告诉工厂要制造哪种面团的参数。这是我推荐的

参数的类型也可以基于特定的工厂。例如:

//TDoughArts tells you what type of arguments the factory needs in order to make dough.

public interface IPizzaIngredientFactory<TDoughArgs> where TDoughArgs : IDoughArgs      

{

    //....

    IDough CreateDough(TDoughArgs doughArgs);

    //....

}


public interface IDoughArgs

{


}


public class NYPizzaDoughArgs : IDoughArgs

{

    public enum DoughTypes

    {

        Thin = 0,

        Thick = 1

    }


    public DoughTypes DoughType { get; set; }

}


public class NYPizzaIngredientFactory : IPizzaIngredientFactory<NYPizzaDoughArgs>

{

    //....

    public IDough CreateDough(NYPizzaDoughArgs doughArgs)

    {

        //Make the right dough based on args here

        if(doughArgs.DoughType == DoughTypes.Thin)

            //...

    }

    //....

}

我在几分钟内就提出来了,因此请检查一致性,但是我想您会明白的。


您不必使用泛型。IDoughArgs如果您不想获得更多的特异性,则可以坚持使用该界面。


用法:


var factory = new NYPizzaIngredientFactory();

var args = new NYPizzaDoughArgs();

args.DoughType = NYPizzaDoughArgs.DoughTypes.Thick;

var dough = factory.createDough(args);


查看完整回答
反对 回复 2021-04-24
  • 2 回答
  • 0 关注
  • 161 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信