我需要创建一些实现给定接口的对象,其中创建的具体实现的类型基于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
模式应该可以解决这个问题,但我不确定如何正确实现它。
答案 0 :(得分:2)
您始终可以创建一个设置容器以传递给CreateValidator
方法。从基础IValidatorSettings
开始,然后创建IModemSerialNumberValidatorSettings
等,然后您的CreateValidator
可以获取ProductType
和IValidatorSettings
个参数。
然后,验证器的具体类将其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()