如果一个工厂总是创建一个新的对象
问题描述:
我们,每一个节点从节点基类public Node(INodeFactory nodeFactory)
工厂注入使节点可以使用Get(int id)
如果一个工厂总是创建一个新的对象
在稍后的时刻创建其子节点派生的层次结构一些节点需要引用结构中的另一个节点。获取引用所需的信息可能会在运行时更改,并且在构建节点对象时不一定可用。基本上这种方法签名看起来是相同的,并且是Get(int id)
。这次不应该创建新的对象,而应该返回现有的对象。
我们的第一次尝试是通过INodeLocator
来搜索节点。首先,我们不确定'定位器'是一个好名字,如果我们在这里错过了一些模式,可能是存储库模式(但只是查找?)。其次,我们注意到方法签名是相同的。
在创建初始树之后,我们正在考虑将工厂从“创建”切换到“查找”模式,但由于稍后还需要创建节点,因此这种模式不起作用。
对于“定位器”逻辑,我们正在考虑通过节点搜索(迭代),但也许最好在平面字典中跟踪它们。但随后出现的问题是工厂可以添加到字典中,但不管理寿命。节点被删除时应该发生什么。
我们如何以适当的方式设计这个问题?
答
按名称区分这两个函数,并将它们添加到您的“工厂”(可能有不同的名称)。例如。
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为重点,节点再加上如果它已经被删除,是值的指示。
我更喜欢将这两个函数都保存在一个类中,因为可以在这里存储新创建的节点,因此可以轻松避免不一致。
这是不正确的地方为您的问题切换到softwareengineering.stackexchange.com –
在阅读https://meta.stackoverflow.com/questions/254570/choosing-between-stack-overflow-and-software-engineering我认为你可能是对的。我从来没有在那里发布。这个应该删除吗? –
我认为它应该被删除。即使这是一个很好的问题,并且如果您查看softwareengineering.stackexchange.com,您也没有关闭选项 –