【发布时间】:2017-04-29 21:06:27
【问题描述】:
我有一个工厂类和 CreateInstance 方法
CreateInstance(EntityModel.TipoEntitaTipoParametroEntita tipoParametroEntita, IParametroEntitaMultiValoreDataSourceProvider parametroEntitaMultiValoreDataSourceProvider)
工厂可以根据tipoParametroEntita.TipoCampo.IdTipoCampo的值实例化两种不同的子类型
重点是CreateInstance的第二个参数(parametroEntitaMultiValoreDataSourceProvider)仅用于创建TipoEntitaTipoParametroEntitaMultiValore的实例
而不是用于创建TipoEntitaTipoParametroEntitaSingoloValore的实例
public class TipoEntitaTipoParametroEntitaFactory : ITipoEntitaTipoParametroEntitaFactory
{
/// <summary>
/// Creates an instance of TipoEntitaTipoParametroEntitaSingoloValore or TipoEntitaTipoParametroEntitaMultiValore
/// </summary>
public TipoEntitaTipoParametroEntita CreateInstance(EntityModel.TipoEntitaTipoParametroEntita tipoParametroEntita, IParametroEntitaMultiValoreDataSourceProvider parametroEntitaMultiValoreDataSourceProvider)
{
if (tipoParametroEntita.TipoCampo.IdTipoCampo == (int)EntityModel.Enum.TipoCampo.CampoLibero ||
tipoParametroEntita.TipoCampo.IdTipoCampo == (int)EntityModel.Enum.TipoCampo.CampoLiberoMultiLinea)
{
return new TipoEntitaTipoParametroEntitaSingoloValore(tipoParametroEntita);
}
if (tipoParametroEntita.TipoCampo.IdTipoCampo ==
(int)EntityModel.Enum.TipoCampo.DropdownListQueryDataSource ||
tipoParametroEntita.TipoCampo.IdTipoCampo ==
(int)EntityModel.Enum.TipoCampo.DropdownListTableDataSource)
{
return new TipoEntitaTipoParametroEntitaMultiValore(tipoParametroEntita,
parametroEntitaMultiValoreDataSourceProvider);
}
return null;
}
}
我对这种采用的模式表示怀疑,因为我总是需要传递 IParametroEntitaMultiValoreDataSourceProvider 的实例,即使没有必要,而且阅读该方法签名的人可能会认为创建任何类型的 @ 987654330@ 需要IParametroEntitaMultiValoreDataSourceProvider 的实例。
什么是更好的方法?两个不同的工厂?只有一个工厂和两个 CreateInstance(一个返回TipoEntitaTipoParametroEntitaSingoloValore,另一个返回TipoEntitaTipoParametroEntitaMultiValore)?
在这两种情况下,我应该已经知道要调用哪个工厂或哪个 CreateInstance,所以我应该每次提前检查tipoParametroEntita.TipoCampo.IdTipoCampo。但我想把这个逻辑只保留在一个地方。
【问题讨论】:
-
您可以使用一个参数和简单的逻辑(检查参考 Impl,design-patterns-stories.com/patterns/FactoryMethod)实现 CreateInstance,并将复杂的逻辑(在当前 iml.)留给调用 CreateInstance() 的客户端。
标签: c# .net design-patterns architecture factory-pattern