我们有一个层次结构,其中每个节点都是从节点基类public Node(INodeFactory nodeFactory)
派生的
注入工厂,以便节点可以使用Get(int id)
稍后,某些节点需要引用结构中的另一个节点。获取引用所需的信息可能在运行时更改,并且在构造节点对象时不一定可用。基本上,此方法签名看起来相同,并且是Get(int id)
。这次不应创建新对象,但应返回现有对象。
我们的第一次尝试是传递将搜索节点的INodeLocator
。首先,我们不确定'定位器'是一个好名字,如果我们在这里缺少一些模式,可能是存储库模式(但只是查找?)。其次我们注意到方法签名是相同的。
我们正在考虑将工厂从“创造”转变为#39;查找'查找'创建初始树之后的模式,但由于以后需要创建节点,因此无法工作。
对于'定位器'逻辑我们考虑通过节点搜索(迭代),但也许最好在平面字典中跟踪它们。但问题出现了,工厂可以添加到字典但不管理生命周期。删除节点时会发生什么。
我们如何以正确的方式设计此问题?
答案 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加上一个指示,如果它已被删除就是值。
我更喜欢将两个函数保存在一个类中,因为可以在此处存储新创建的节点,因此可以轻松避免不一致。