【发布时间】:2015-05-21 14:13:24
【问题描述】:
使用反射的简单工厂包括在哈希表中存储(注册)各种类型名称及其对应的类类型,然后使用此哈希表在工厂中生成对象。
interface Product
{
void foo();
}
class ProductFactory
{
HashTable m_RegisteredProducts = new HashTable();
public void registerProduct(string productID, Type p) {
m_RegisteredProducts.add(productID, p);
}
public Product createProduct(string productID){
return (Product) new m_RegisteredProducts[productID];
}
}
我不清楚注册新类型的过程何时发生,因为要使用的所有类型都将在运行时加载到哈希表中。在哪里调用 registerProduct()?
- 在 ProductFactory 类的一个地方为所有不同的类调用 registerProduct() 没有意义,因为它会破坏使用反射而不是简单的 switch/case 方法的目的。
- 如果在实现接口的所有类的类定义中调用 registerProduct(),则在 在/使用工厂之后创建该类的实例,因此总是会出错。
【问题讨论】:
-
工厂应该生产实例。不应该采取实例(就像你正在做的那样)。
-
这是一个伪代码,感谢您指出混淆。我会做出改变。
-
您使用的是简单工厂,也就是具体工厂,而不是工厂方法模式。看看stackoverflow.com/questions/26511823/… 的区别简单工厂并不是真正的设计模式(它是一种编程习惯),也绝对不是factory-pattern,因为没有“子类决定要实例化哪个类”。
标签: c# design-patterns factory