创造一个类A来允许灵活地创造新“类型”,类A的每个实例都代表了不同的对象类型。
- 你不知道你后面还需要什么类型。(举个例子,如果你的游戏需要支持资料包,而资料包有新的怪物品种呢?)
- 想不改变代码或者重新编译就能修改或添加新类型,即达到子类的名字、基本属性都是可以通过Json配置的目的
-
定义类型对象类和有类型的对象类。
-
每个类型对象实例代表一种不同的逻辑类型。
-
每种有类型的对象保存对描述它类型的类型对象的引用。
-
实例相关的数据被存储在有类型对象的实例中,被同种类分享的数据或者行为存储在类型对象中。
-
引用同一类型对象的对象将会像同一类型一样运作。
这让我们在一组相同的对象间分享行为和数据,就像子类让我们做的那样,但没有固定的硬编码子类集合。
优点
- 可以快速、便捷的添加新的类型
缺点
- 更难为每种类型定义行为
- 需要手动追踪类型对象
-
这个模式处理的高层问题是在多个对象间分享数据和行为。 另一个用另一种方式解决了相同问题的模式是原型模式。
-
类型对象是享元模式的近亲。 两者都让你在实例间分享代码。使用享元,意图是节约内存,而分享的数据也许不代表任何概念上对象的“类型”。 使用类型对象模式,焦点在组织性和灵活性。
-
这个模式和状态模式有很多相似之处。 两者都委托对象的部分定义给另外一个对象。 通过类型对象,我们通常委托了对象是什么:不变的数据概括描述对象。 通过状态,我们委托了对象现在是什么:暂时描述对象当前状态的数据。
当我们讨论对象改变它的类型时,你可以认为类型对象起到了和状态相似的职责。