工厂是否应始终创建新对象

时间:2017-04-05 11:28:45

标签: c# design-patterns dependency-injection repository-pattern factory-pattern

我们有一个层次结构,其中每个节点都是从节点基类public Node(INodeFactory nodeFactory)派生的 注入工厂,以便节点可以使用Get(int id)

创建其子节点

稍后,某些节点需要引用结构中的另一个节点。获取引用所需的信息可能在运行时更改,并且在构造节点对象时不一定可用。基本上,此方法签名看起来相同,并且是Get(int id)。这次不应创建新对象,但应返回现有对象。

我们的第一次尝试是传递将搜索节点的INodeLocator。首先,我们不确定'定位器'是一个好名字,如果我们在这里缺少一些模式,可能是存储库模式(但只是查找?)。其次我们注意到方法签名是相同的。

我们正在考虑将工厂从“创造”转变为#39;查找'查找'创建初始树之后的模式,但由于以后需要创建节点,因此无法工作。

对于'定位器'逻辑我们考虑通过节点搜索(迭代),但也许最好在平面字典中跟踪它们。但问题出现了,工厂可以添加到字典但不管理生命周期。删除节点时会发生什么。

我们如何以正确的方式设计此问题?

1 个答案:

答案 0 :(得分:0)

按名称区分这两个函数,并将它们添加到“工厂”(可能需要不同的名称)。 E.g。

public interface INodeFactory
{
    // creates a new Node and returns it
    Node Create(int id);

    // retrieves an existing node
    Node Get(int id);

    // deletes a Node
    void Delete(int id);
}

一个实现在内部保留某种字典,其中id是密钥,Node加上一个指示,如果它已被删除就是值。

我更喜欢将两个函数保存在一个类中,因为可以在此处存储新创建的节点,因此可以轻松避免不一致。