在工厂方法中使用匹配模式(开关)的最佳方式是什么



我想使用以下结构创建对象:

IProduct product1 = creator.CreateProduct<ConcreteProduct1>();
IProduct product2 = creator.CreateProduct<ConcreteProduct2>();

我的CreateProduct方法版本如下:

public T CreateProduct<T>()
where T: IProduct, new()
{
switch (typeof(T))
{
case(...) return new ConcreteProduct1;
case(...) return new ConcreteProduct2;
}
}

我的问题是,我不知道如何在这种情况下使用匹配模式。我尝试了几个选项:

case (typeof(ConcreteProduct1)): return new ConcreteProduct1;
case (ConcreteProduct1 c): return new ConcreteProduct1;

但所有这些都不起作用。

我应该在case语句中使用哪些表达式?或者我还有什么其他选择来实现这种方法?

如果ConcreteProduct1ConcreteProduct2类实现IProduct接口,则不需要任何开关表达式,只需简单地返回一个新实例(因为您已经将所需类型传递为泛型类型参数T,并将泛型类型约束传递给无参数构造函数(

public T CreateProduct<T>()
where T: IProduct, new()
{
return new T();
}

当我们希望实现应用程序组件之间的松散耦合,并且只操作接口而不知道当前实例化了哪个实现时,这样做是有用的。例如,假设我们有以下接口:

interface IProduct
{
}
interface IArticle
{
}

假设这些接口具有以下实现:

class ConcreteProduct1: IProduct
{
}
class ConcreteProduct2: IProduct
{ 
}
class ConcreteArticle1: IArticle
{
}
class ConcreteArticle2: IArticle
{
}

现在,在代码库的客户端部分,我们希望在不知道当前实例化了哪个实现的情况下操作IArticleIProduct,类似于:

static void Main()
{
var article = Factory.Create<IArticle>();
var product = Factory.Create<IProduct>();
}

Factory看起来是这样的:

public static class Factory
{
public static T Create<T>() where T : class
{
return Activator.CreateInstance(ImplementationOf<T>()) as T;
}
public static Type ImplementationOf<T>()
{
// Concrete types registration
var map = new Dictionary<Type, Type>()
{
[typeof(IArticle)] = typeof(ConcreteArticle1),
[typeof(IProduct)] = typeof(ConcreteProduct2)
}

return map[typeof(T)];
}
}

这里,Factory.ImplementationOf方法包含接口和要在运行时使用的具体类型之间的映射。而且,在未来,如果我们想切换到接口的另一个实现,比如ConcreteArticle2forIArticle,我们只需要修改这个方法,而不需要接触客户端代码。

最新更新