原型模式:使用特定原型实例来创建特定种类的对象,并且通过拷贝原型来创建新的对象。

# 写在前面

假如在游戏中我们需要生成各种各样的怪物,我们需要一个孵化器,我们想到为每个怪物类型确定一个孵化器,如下图所示:

GhostGhostSpawnerDemoDemoSpawner

✔️ 不难想到,我们可以抽象出怪物的基类对上面的结构进行优化。

/// <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 不断强化编译技术,虚拟机效率,现在的动态语言才能高效执行。

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Fasty 微信支付

微信支付

Fasty 支付宝

支付宝

Fasty 贝宝

贝宝