导航

意图:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。

适用性:

  • 当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者
  • 为了避免创建一个与产品类层次平行的工厂类层次时;或者
  • 当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。



结构:

using System;

namespace DesignPattern
{
 /// <summary>
    /// 依赖关系的倒置(很多设计模式均如此)
 /// 抽象不应该依赖于实现细节,实现细节应该依赖于抽象
    /// “动态视图”看软件开发
    /// 动机:软件系统中,经常面临“某些结构复杂的对象”的创建
    /// 工作;由于需求的变化,这些对象经常面临剧烈的变化,但是
    /// 它们却拥有比较稳定一致的接口
    /// 意图:使用原型实例指定创建对象的种类,然后通过拷贝这些原型
    /// 来创建新的对象
    /// 要点:  它同样用于隔离类对象使用者和具体类型之间的耦合关系,它
    ///         同样要求这些“易变类”拥有“稳定的接口”
    ///         对于“如何创建易变类的实体对象”采用“原型克隆”的方法
    ///         来做,它使得我们可以非常灵活的动态创建“拥有某些稳定接口”
    ///         的新对象——所需工作仅仅是注册一个新类的对象(即原型),然后
    ///         在任何需要的地方不断的Clone
    ///         Clone方法可以利用.net中的Object类的MemberwiseClone()方法或者 
    ///         序列化来实现深拷贝
    /// 创建性模式的讨论:
    ///     Singleton模式解决的是实体对象个数的问题。除了它之外其它创建型模式
    /// 解决的都是new所带来的耦合关系
    ///     Factory Method,Abstract Factory,Builder都需要一个额外的工厂类来负责
    /// 实例化“易变对象”,而Prototype则是通过原形(一个特殊的工厂类)来克隆“易变对象”
    ///     如果遇到“易变类”,起初的设计通常从Factory Method开始,当遇到更多的复杂变化
    /// 时,再考虑重构为其它三种工厂模式
 /// </summary>
 public class Prototype
 {
  public Prototype()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }
 }
    public abstract class NormalActor {
        public abstract NormalActor Clone();
    }
    public abstract class FlyActor
    {
        public abstract FlyActor Clone();
    }
    public abstract class WaterActor
    {
        public abstract WaterActor Clone();
    }
    //MemberwiseClone 按成员拷贝,浅拷贝(深克隆,拷贝之后没有共享部分)
    //Serialize对象经过DeSerialize之后一定是深拷贝
    public class NormalActorA : NormalActor {
        public override NormalActor Clone() {
            return (NormalActor)this.MemberwiseClone();//NormalActorA will do also
        }
    }
    public class NormalActorB : NormalActor
    {
        public override NormalActor Clone()
        {
            return (NormalActor)this.MemberwiseClone();
        }
    }
    public class FlyActorA : FlyActor
    {
        public override FlyActor Clone()
        {
            return (FlyActor)this.MemberwiseClone();
        }
    }
    public class FlyActorB : FlyActor
    {
        public override FlyActor Clone()
        {
            return (FlyActor)this.MemberwiseClone();
        }
    }
    public class WaterActorA : WaterActor
    {
        public override WaterActor Clone()
        {
            return (WaterActor)this.MemberwiseClone();
        }
    }
    public class WaterActorB : WaterActor
    {
        public override WaterActor Clone()
        {
            return (WaterActor)this.MemberwiseClone();
        }
    }
    public class GameSystem {
        //参数,或者用字段
        public void Run(NormalActor normalActor,
            FlyActor flyActor,
            WaterActor WaterActor)
        {
            NormalActor marine1 = normalActor.Clone();
            NormalActor marine2 = normalActor.Clone();
            NormalActor marine3 = normalActor.Clone();
            NormalActor marine4 = normalActor.Clone();
            NormalActor marine5 = normalActor.Clone();

            FlyActor fly1 = flyActor.Clone();
            FlyActor fly2 = flyActor.Clone();

            WaterActor water1 = WaterActor.Clone();
            WaterActor water2 = WaterActor.Clone();

        }
    }
    class ProtoTypeApp {
        public static void Main() {
            GameSystem gameSystem = new GameSystem();
            gameSystem.Run(new NormalActorA(),new FlyActorB(),new WaterActorA())
        }
    }
}