design-patterns - 两个类之间的“创建”/实例化关系是什么?
问题描述
来自 Gamma 等人的设计模式
表示部分或聚合关系的对象引用由底部带有菱形的带箭头的线指示。箭头指向聚合的类 (例如,Shape)。
没有菱形的带箭头的线表示熟人(例如,LineShape 保持对 Color 对象的引用,其他形状可能共享该对象)。参考名称可能会出现在底座附近,以区别于其他参考
另一个有用的东西是哪些类实例化 了哪些其他类。我们使用带箭头的虚线来表示这一点,因为 OMT 不支持它。我们称之为“创造”关系。箭头指向实例化的类。在图 c 中,CreationTool 创建 LineShape 对象。
我想了解这本书所说的“创造”关系是什么意思。
当类 A 实例化类 B 时,类 A 必须有一个引用对象 B 的字段成员,还是类 A 必须有一个创建并返回对象 B 的方法?
是否有一些使用“创建”/实例化关系的设计模式(例如,在同一本书中描述)?我找不到它。
解决方案
A 创建 B只是意味着 A 中的代码直接创建 B 的实例——通过使用new
关键字。代码可以在 A 的构造函数或任何方法中,也可以在 A 内部的任何地方。
之所以关注这种关系,是因为它是一种强关系,即导致类之间的紧耦合。当 A 类直接创建 B 类的实例时,我们不能在不修改 A 的源代码的情况下在希望 A 创建 B 的子类的实例的另一个上下文中重用 A。
为了具有这样的灵活性,我们经常使用工厂方法模式或抽象工厂模式。在这些模式中,直接创建实例的任务属于 A 的子类(工厂方法)或具体工厂类(抽象工厂)。
推荐阅读
- django - 尝试使用 manage.py 时没有名为“djangosite”的模块
- html - 标签宽度适合标签文本
- reactjs - React Native - 使用我制作的自定义组件时出错(错误:未定义无法解析模块
) - jenkins - 如何在 jenkins slave 中查看构建控制台输出
- python - 通过循环不断更新QTableView
- node.js - kraken.js 没有创建新项目
- python - 使用 tkinter 运行另一个 python 脚本
- javascript - 如何将字符串的 java ArrayList 传递给 JavaScript
- python - 获取 Python Django Rest 框架代码的错误
- c - int *ptr= 5; 与 int *ptr= 变量地址不同?