如何创建工厂?

时间:2012-07-28 02:46:22

标签: c# types dictionary factory

在这个问题上,我正在处理一个应该作为工厂工作的映射器类。

到现在为止,我正在使用字典作为映射器。

IDictionary<string, Type> mapper;

这个想法是当我得到一个字典值时,这应该是实例化的,例如:

var foo = mapper["foo"];  // this should return the instance of foo

另一个问题是:

var foo2 = mapper["foo"]  // should be the same instance of foo (foo == foo2)

几个月前,我想我已经看过一些关于容器的事情,我不确定这个术语是否正确,如果这可以帮助我。 有什么想法吗?

更新:

我真的没有任何代码。我在想的是字典的值应该是Func&lt;&gt;而不是Type,或者使用Activator类作为中间体,虽然我猜这些都不是好选择。我计划在代码中添加100多个项目,它会非常累。

2 个答案:

答案 0 :(得分:1)

你的意思是这样吗?

abstract class MyBase { }
class Type1 : MyBase { }
class Type2 : MyBase { }
class Type3 : MyBase { }

private static readonly Dictionary<Type, Func<MyBase>> sConstructors =
   new Dictionary<Type, Func<MyBase>>
{
   { typeof(Type1), () => new Type1() },
   { typeof(Type2), () => new Type2() },
   { typeof(Type3), () => new Type3() }   
};

...

Type type = typeof(Type1);
MyBase myBase = sConstructors[type]();

使用反射,您甚至可以自动构建这些反射,而不必手动维护它们。

答案 1 :(得分:1)

它被称为Service Locator Anti-Pattern

而是查看@drumboog建议的内容 - Dependency Injection Containers

对字面意思的完整解释需要book