3

我想编写一个工厂方法来实例化一个作为聚合根的实体。

该方法应该接受聚合的子实体和值作为实例化对象,还是应该只接受原始类型?

例如,如果我有一个由处理器和内存对象组成的实体计算机,工厂方法是否应该采用以下形式:

public Computer NewComputer(
    string computerName, 
    int processorCores, 
    int processorClockSpeed, 
    string memoryType, 
    int memoryRam) 
{
    ...
}

或者

public Computer NewComputer(
    string computerName, 
    Processor processor, 
    Memory memory) 
{
    ...
}

这只是品味问题,还是这里有任何认真的考虑?

4

3 回答 3

2

这只是一个品味问题,尽管它可能取决于您的对象创建策略,而且您可能会混合和匹配它们。

如果您的聚合根已经有其子对象的工厂方法(例如,如果CreateProcessor()已经存在以支持添加额外的处理器),那么您的第一种方法可能是合适的。

或者,如果您使用ComputerFactory(或存储库)来创建或重构聚合根,该工厂可能已经知道如何创建子对象,在这种情况下,它将在构建聚合图和您的第二种方法的途中创建它们将是适当的。

于 2009-10-06T14:49:13.370 回答
1

“聚合根”是对象图的最顶层节点。所有其他对象都是通过这个根对象创建和访问的。换句话说:如果您通过外部工厂方法创建计算机类的组件,那么您不能再将其称为“聚合根”。这并不是说您的第二个示例在某种程度上不好或有异味或其他什么,只是它不符合“总根”概念...

于 2009-10-06T15:01:22.520 回答
1

关于使用工厂方法的好处(我对聚合和根的规则不是很熟悉):

  • 我想处理器和内存是具有某些行为的对象,您希望将这些行为与计算机类分开。
  • 计算机类构造函数可以是

    public Computer(string computerName, IProcessor processor, IMemory memory) 
    {
    }
    

您的计算机类现在不依赖于处理器和内存的特定实现。其他类负责使用具有特定内存和处理器的计算机。

使用这种方法,您将获得更多可维护代码的好处,并且能够在不更改计算机的情况下升级内存和处理器。

不知道这是否会在您的特定情况下回答您的问题,但希望这会有所帮助。其他资源是:

  1. http://www.objectmentor.com/resources/articles/inheritanceVsDelegation.pdf
  2. 固体电子书:http ://www.lostechies.com/content/pablo_ebook.aspx
于 2009-10-06T17:59:27.767 回答