原型模式:使用特定原型实例来创建特定种类的对象,并且通过拷贝原型来创建新的对象。
# 写在前面
假如在游戏中我们需要生成各种各样的怪物,我们需要一个孵化器,我们想到为每个怪物类型确定一个孵化器,如下图所示:
✔️ 不难想到,我们可以抽象出怪物的基类对上面的结构进行优化。
/// <summary> | |
/// 怪物基类 | |
/// </summary> | |
public abstract class Monster | |
{ | |
public int Hp { get; set; } | |
public float Speed { get; set; } | |
public abstract Monster Clone(); | |
public override string ToString() | |
{ | |
return $"Hp:{Hp} Speed:{Speed}"; | |
} | |
} | |
/// <summary> | |
/// 幽灵类 | |
/// </summary> | |
class Ghost: Monster | |
{ | |
public override Monster Clone() | |
{ | |
return new Ghost(){Hp=base.Hp,Speed = base.Speed}; | |
} | |
} | |
/// <summary> | |
/// 孵化器 | |
/// </summary> | |
class Spawner | |
{ | |
private Monster _monster; | |
public Spawner(Monster monster) | |
{ | |
_monster = monster; | |
} | |
public Monster SpawnerMonster() | |
{ | |
return _monster.Clone(); | |
} | |
} |
var gh = new Ghost() {Hp = 45, Speed = 3.3f}; | |
var spa = new Spawner(gh); | |
var en= spa.SpawnerMonster(); | |
Console.WriteLine(en); |
# 结论
关于这个模式,有一点比较优雅的是,它不仅克隆原型类,而且它也克隆了对象的状态。
基于这样的 模板(原型)
,我们可以创建出类似的一系列对象。
📘 Ps: 有兴趣的话可以去看看 Self语言
相信你会对原型,oop 有新的认识 —— 类并不是实现 oop 的唯一方法。
📖OOP 的特征是它将状态和行为结合得更紧密。
# 扩展
正是 self 基于原型的设计理念,诞生了现在大受欢迎的 javascript
;
正是 self 不断强化编译技术,虚拟机效率,现在的动态语言才能高效执行。