代码之家  ›  专栏  ›  技术社区  ›  JW.

通过工厂方法向特定子类传递参数

  •  8
  • JW.  · 技术社区  · 16 年前

    但每一种饮料也有其独特的要求。也许葡萄酒需要一个品酒师助手对象来初始化自己。啤酒不需要这个,但它可能需要自己的助手对象。

    那么,我应该把什么传给工厂方法呢?当我调用它时,我拥有所有可用的helper对象,所以我可以将它们全部传递给工厂。但这可能会导致很多争论。有没有更好的方法来设计这个?

    编辑:

    7 回复  |  直到 16 年前
        1
  •  4
  •   sipsorcery    16 年前

    我将在您的工厂类中创建不同的重载方法。

    public class DrinkFactory {
    
        public static Drink CreateBeer(DrinkConfig config, string hops) {
            return new Beer(config, hops);
        }
    
        public static Drink CreateWine(DrinkConfig config, string grapes, int temperature) {
            return new Wine(config, grapes, temperature);
        }
    }
    

    编辑:

    如果希望工厂类中只有一个方法,则另一个实现是:

    public enum DrinksEnum {
        Beer,
        Wine
    }
    
    public class DrinkFactory {
    
        public static Drink CreateDrink(DrinksEnum drinkType, DrinkConfig config) {
            switch(drinkType) {
                case DrinksEnum.Beer:
                    return new Beer(config);
                case DrinksEnum.Wine:
                    return new Wine(config);
                default:
                    throw new ApplicationException("Drink type not recognised.");
            }
        }
    }
    
        2
  •  2
  •   dave4420    16 年前

        3
  •  1
  •   AlbertoPL    16 年前

    工厂首先应该创建非常相似的对象。这意味着,尽管所有这些对象都是饮料,但工厂方法可能并不合适,因为每种饮料都与其他饮料有很大不同。

    尽管如此,您可以传递一个对象列表,其大小等于要设置的属性数。然后,每个对象都将表示要在相应对象的构造函数中设置的值,按设置这些变量的顺序排列。这样做的缺点是,在进行调用之前,必须在工厂外格式化列表,这有点笨拙。

        4
  •  0
  •   dirkgently    16 年前

    我很想提供一个简单的解决方案,其中你的成分来源于一个基本类“饮品成分”。您必须匹配用于特定饮料的子类。

    显然,你可能会想为这些原料建立另一家工厂,但这会导致鸡和蛋的问题。

        5
  •  0
  •   Brad B    16 年前

    此外,在许多情况下,像Spring这样的框架将允许您在配置文件而不是代码中描述这些关系。

    如果您真的需要在运行时从调用代码传入帮助程序,我建议您阅读论文“Arguments and Results”( http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.50.7565

        6
  •  0
  •   Reed Copsey    16 年前

    在这种情况下,我通常会寻找其他解决方案,而不是传递变量。

    这是一个很好的运行时依赖注入用例。某种形式的依赖注入框架将使这一点非常简单、易懂,而且只是一种工作,而无需传递所有这些属性。

        7
  •  0
  •   wizurd    11 年前

    这看起来是个完美的案子 Builder Factory 用于创建类似对象的模式,以及 建设者 构造复杂、不同对象的模式。尝试使用 工厂 此问题的模式将导致不同对象的许多不同的初始化构造函数(具有不同数量/类型的参数)。