工厂模式会解决我的问题吗?

时间:2010-08-03 10:06:09

标签: c# design-patterns

我需要创建一些实现给定接口的对象,其中创建的具体实现的类型基于Enum值。

当不同的具体实现在运行时需要不同的参数时,我遇到了麻烦。

这个例子(C#)很好:

public enum ProductCategory
{
    Modem,
    Keyboard,
    Monitor
}

public class SerialNumberValidatorFactory()
{
    public ISerialNumberValidator CreateValidator(ProductCategory productCategory)
    {
        switch (productCategory)
        {
            case ProductCategory.Modem:
                return new ModemSerialNumberValidator();
            case ProductCategory.Keyboard:
                return new KeyboardSerialNumberValidator();
            case ProductCategory.Monitor:
                return new MonitorSerialNumberValidator();
            default:
                throw new ArgumentException("productType", string.Format("Product category not supported for serial number validation: {0}", productCategory))
        }
    }
}

但是,如果具体实现具有不同的构造函数参数会发生什么?我无法将所有值传递给SerialNumberValidatorFactory.CreateValidator()方法,所以我该如何处理?

我听说Abstract Factory模式应该可以解决这个问题,但我不确定如何正确实现它。

2 个答案:

答案 0 :(得分:2)

您始终可以创建一个设置容器以传递给CreateValidator方法。从基础IValidatorSettings开始,然后创建IModemSerialNumberValidatorSettings等,然后您的CreateValidator可以获取ProductTypeIValidatorSettings个参数。

然后,验证器的具体类将其IXXXValidatorSettings接口作为唯一的构造函数参数。

此外,您可以创建一个IValidatorSettings工厂。

我认为抽象工厂是一个工厂,它创建一个工厂来处理一组给定的类型 - 不确定它是否适用于你的场景。

答案 1 :(得分:2)

您使用的是工厂方法模式,您应该使用的是抽象工厂

在抽象工厂中,您为每个具体实现提供工厂类:

所以你的代码变成:(原谅代码,但理由相同)

public class SerialNumberValidatorFactory
{
    public static SerialNumberValidatorFactory newInstance(
           ProductCategory productCategory)
    {
        switch (productCategory)
        {
            case ProductCategory.Modem:
                return new ModemValidatorFactory();
            ....
        }
    }

    public abstract ISerialNumberValidator createValidator();
}

public class ModemValidatorFactory extends SerialNumberValidatorFactory
{
   public ISerialNumberValidator createValidator() 
   {
      return new ModemSerialNumberValidator("model", "number");
   }
}

ISerialNumberValidator = SerialNumberValidatorFactory.newInstance(productCategory).createValidator()