意图:使用原型实例指定创建对象的种类,然后通过拷贝这些原型来创建新的对象
可适用性:
当要实例化的类是在运行时刻指定时,例如,通过动态装载;或者
为了避免创建一个与产品类层次平行的工厂类层次时;或者
当一个类的实例只能有几个不同状态组合中的一种时。建立相应数目的原型并克隆它们可能比每次用合适的状态手工实例化该类更方便一些。
UML图解:
示例代码:
1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using System.Text; 5 6 namespace Prototype 7 { 8 /*** 9 * 举例描述,假设魂斗罗游戏,其中有各种各样的角色 10 * 比如从抽象概念上有NormalActor、FlyActor、WaterActor,其中每一种角色又 11 * 对应A、B、C三种具体人物等等;在游戏开始需要创建若干种人物出场进行决斗 12 * ***/ 13 public class GameSystem 14 { 15 NormalActor na; FlyActor fa; WaterActor wa; 16 17 public void Run(NormalActor na,FlyActor fa,WaterActor wa) 18 { 19 //以下就是使用原型实例创建对象的种类;Clone()方法也实现了以后的多态特征 20 NormalActor na1 = na.Clone(); 21 NormalActor na2 = na.Clone(); 22 23 FlyActor fa1 = fa.Clone(); 24 FlyActor fa2 = fa.Clone(); 25 26 WaterActor wa1 = wa.Clone(); 27 WaterActor wa2 = wa.Clone(); 28 } 29 } 30 31 //角色抽象类定义 32 public abstract class NormalActor 33 { 34 public abstract NormalActor Clone(); 35 } 36 public abstract class FlyActor 37 { 38 public abstract FlyActor Clone(); 39 } 40 public abstract class WaterActor 41 { 42 public abstract WaterActor Clone(); 43 } 44 45 /*** 46 * 注意:在C#中this.MemberwiseClone();属于浅拷贝;即当类对象执行浅拷贝时,类中引用类型 47 * 的成员仍然是被共享的,即拷贝的是其引用成员的地址;要实现其深度拷贝有两种方法: 48 * ①即new一个该类的实例,将当前对象的成员的值一一赋给新的对象返回此新的对象 49 * ②使用序列化和反序列,即将当前对象序列化到内存流中,然后再将其从内存流中反序列化得到的 50 * 一定是深度拷贝的新对象 51 * ***/ 52 53 54 //角色类的具体实现 55 public class NormalActorA : NormalActor 56 { 57 58 public override NormalActor Clone() 59 { 60 return (NormalActor)this.MemberwiseClone(); 61 } 62 } 63 64 public class FlyActorA : FlyActor 65 { 66 67 public override FlyActor Clone() 68 { 69 return (FlyActor)this.MemberwiseClone(); 70 } 71 } 72 73 public class WaterActorrA : WaterActor 74 { 75 76 public override WaterActor Clone() 77 { 78 return (WaterActor)this.MemberwiseClone(); 79 } 80 } 81 82 83 }
注:本示例代码是本人学习Webcast C#面向对象设计模式纵横谈系列讲座视频时,跟着李建忠老师一步一步的编写的,在此奉献出来,仅供大家参考