我想使用以下结构创建对象:
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语句中使用哪些表达式?或者我还有什么其他选择来实现这种方法?
如果ConcreteProduct1
和ConcreteProduct2
类实现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
{
}
现在,在代码库的客户端部分,我们希望在不知道当前实例化了哪个实现的情况下操作IArticle
和IProduct
,类似于:
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
方法包含接口和要在运行时使用的具体类型之间的映射。而且,在未来,如果我们想切换到接口的另一个实现,比如ConcreteArticle2
forIArticle
,我们只需要修改这个方法,而不需要接触客户端代码。