Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 模式来构建对象的大型层次结构_Design Patterns_Oop_Architecture - Fatal编程技术网

Design patterns 模式来构建对象的大型层次结构

Design patterns 模式来构建对象的大型层次结构,design-patterns,oop,architecture,Design Patterns,Oop,Architecture,我有一个问题,涉及一个相对较大的对象层次结构,如下所示: 游戏有一个社区管理员 社区管理器有一个网络 网络有很多玩家 网络有很多友谊 玩家有一个战略经理 玩家只有一个记忆 玩家有一个邻居 这个社区有很多玩家 战略经理有很多战略 如您所见,层次结构相对复杂,并且至少在一个地方是循环的(网络中有许多代理,它们有一个邻居,而邻居有一个网络)。目前,我在GameFactory类上使用静态构造方法来构造整个层次结构,但我很确定这是最不灵活的方法 在构建复杂的对象层次结构方面,最佳模式是什么?我已经阅读

我有一个问题,涉及一个相对较大的对象层次结构,如下所示:

  • 游戏有一个社区管理员
  • 社区管理器有一个网络
  • 网络有很多玩家
  • 网络有很多友谊
  • 玩家有一个战略经理
  • 玩家只有一个记忆
  • 玩家有一个邻居
  • 这个社区有很多玩家
  • 战略经理有很多战略
如您所见,层次结构相对复杂,并且至少在一个地方是循环的(网络中有许多代理,它们有一个邻居,而邻居有一个网络)。目前,我在
GameFactory
类上使用静态构造方法来构造整个层次结构,但我很确定这是最不灵活的方法

在构建复杂的对象层次结构方面,最佳模式是什么?我已经阅读了
工厂方法
抽象工厂
构建器
模式,我认为其中一种工厂模式是合适的,但我真的不知道如何将其应用于如此复杂的层次结构

在我看来,系统的每个部分都需要许多工厂,但这将导致工厂类集合镜像模型类


编辑:从到目前为止给出的建议中的讨论中可以清楚地看出,我本应该更多地解释为什么我要求工厂构建我的对象层次结构,而不是允许构造函数自己构建它们的依赖关系

这是因为我使用依赖注入来帮助测试驱动的开发。我采用mockist方法进行测试,这需要能够注入表示对象依赖关系的mock,因此我必须避免在任何构造函数中使用
new

从目前给出的建议来看,似乎有多种可行的方法:

  • 在每个类中创建一个二级构造函数,用于构建所构造对象所需的任何依赖项。这允许依赖项注入和简单的对象层次结构构造
  • 将工厂类(单个工厂类或它们的层次结构,具体取决于所使用的工厂模式的类型)映射到每个域类以处理其构造
  • 使用这些方法的组合,其中工厂类仅在构造过程中发生变化时创建(即,在某些情况下需要构造不同的子类)
我倾向于走最后一条路。在这种情况下,对最佳方法的共识是什么



编辑:我撤销当前的答案(Patrick Karcher的答案),因为现在这个问题的焦点已经澄清,没有任何建议是完整的答案。

如果没有任何变化,即如果你的施工过程是固定的,我推荐最简单的方法:让对象自己负责构建它们的依赖对象,并建立链接(可能是双向的)

示例:对于具有子对象集合的父对象,父对象可以使用addChild方法来确保双向关系的一致性:

  • 获取子级的上一个父级;如果不为null,则从该旧父级中删除该子级
  • 将子项中的父项字段更改为新父项
  • 将子项添加到新父项的子项集合中
  • 如果某些内容发生变化,比如子类,而不是应该在某些上下文中使用,那么您必须准确定义变化的内容。只有在您找到确切的需求后,才可能出现正确的模式。:-)


    最后一部分我们可以帮忙,但你是唯一能提供所需信息的人…;-)

    了解为什么你需要一个工厂是很重要的。与许多“良好”实践一样,工厂可以产生某些优势,这些优势有时是您想要的,只有正确使用它们才能获得

    工厂通常是对象模型中的另一个类。例如,你经常会得到一个玩家,因为你有一个邻居有一个玩家集合,你会在其中迭代,对玩家做一些事情。或者从网络对象开始。或者(我猜)你已经有了一个球员,你得到了友谊,你也从中得到了球员。所以友谊是玩家物品的工厂,玩家是友谊物品的工厂

    但有时确实有理由使用非域、专用工厂对象。您可能有一个工厂类作为开始逻辑的对象的起点。通常在有很多复杂的方法需要实例化某些对象时使用它们,而工厂是组织它们的好方法。有时您的对象需要实例化,例如,一个数据层、一个用户和一个上下文,工厂可以维护这些东西,创建您的对象,避免您在许多不同的构造函数中重复自己。有时,工厂可以自动生成各种工具所需的公共引用

    有一个工厂的用途正在迅速普及,值得特别提及。这是使用factory类向添加一层误导,特别是对于单元测试

    我的建议是,如果您心中没有使用factory对象的具体原因,不要担心它们。只需使用好的构造函数构建对象。然后添加返回相关对象的属性是很自然的;这将是你们的第一个工厂。这可能是一个很好的例子,说明您一开始不想担心设计模式;设计模式不能带来成功。是的。模式,就像各种工厂模式一样,他可以吗