温故而知新:设计模式之原型模式(Prototype)

原型模式个人以为最适合的场景:参照现有的某一个对象实例,快速得到多个完整的实例副本。(通常是深拷贝的副本)

深拷贝在c#中实现的最简单方式莫过于通过反序列化得到一个全新的对象实例。(当然如果浅拷贝的话,方法就很多了,比如利用MemberwiseClone或反射属性自动赋值都可以)

场景:还是游戏场景,就拿三国来说吧,打仗时可能需要小兵若干,每个小兵可能还要骑马...(简单起见其它东东就不提了,比如可能每个小兵还要带兵器若干),这些个实例的数量是动态的,

但是几乎每个小兵的属性都完全相同,每匹战马的属性也相同,很显然写一堆的new()造出若干实例,再逐一对属性赋值是可行的,但是并非最好的做法,下面看看原型的实现:

原型模式代码示例-by 菩提树下的杨过

  1 using System;
  2 using System.Collections.Generic;
  3 using System.IO;
  4 using System.Runtime.Serialization.Formatters.Binary;
  5 
  6 namespace Prototype
  7 {
  8     class Program
  9     {
 10         static void Main(string[] args)
 11         {
 12             #region 构造原型库
 13             PrototypeManager pm = new PrototypeManager();
 14             string _solider = "solider",_horse = "horse";
 15             pm[_solider] = new Soldier() { Name = "小兵", Life = 300 };
 16             pm[_horse] = new Horse() { Life = 250 };
 17             #endregion
 18 
 19             //从原型库里批量复制出若干实例
 20             Soldier s1 = pm[_solider].Clone() as Soldier;
 21             Soldier s2 = pm[_solider].Clone() as Soldier;
 22             Soldier s3 = pm[_solider].Clone() as Soldier;
 23 
 24             Horse h1 = pm[_horse].Clone() as Horse;
 25             Horse h2 = pm[_horse].Clone() as Horse;
 26 
 27             //测试对象引用是否相同
 28             Console.WriteLine(object.ReferenceEquals(s1, s2));
 29             Console.WriteLine(object.ReferenceEquals(h1, h2));
 30 
 31             Console.Read();
 32 
 33         }
 34 
 35 
 36     }
 37 
 38     [Serializable]
 39     public class Prototype //原型 父类
 40     {
 41         public Prototype Clone() 
 42         {
 43             MemoryStream ms = new MemoryStream();
 44             BinaryFormatter bf = new BinaryFormatter();
 45             bf.Serialize(ms, this);
 46             ms.Position = 0;
 47             return bf.Deserialize(ms) as Prototype;
 48         }
 49     }
 50 
 51     /// <summary>
 52     /// 小兵
 53     /// </summary>   
 54     [Serializable]
 55     public class Soldier : Prototype 
 56     {
 57         public string Name//名称
 58         {
 59             set;
 60             get;
 61         }
 62 
 63         public int Life //生命值
 64         {
 65             set;
 66             get;
 67         }       
 68     }
 69 
 70 
 71     /// <summary>
 72     /// 战马
 73     /// </summary>   
 74     [Serializable]
 75     public class Horse : Prototype
 76     {
 77         
 78         public int Life //生命值
 79         {
 80             set;
 81             get;
 82         }
 83     }
 84 
 85     /// <summary>
 86     /// 原型管理器(即原型库,注:并非必需的,但通常保留一个,方便用此来创建原型实例)
 87     /// </summary>
 88     public class PrototypeManager
 89     {
 90         Dictionary<string, Prototype> dic = new Dictionary<string, Prototype>();
 91 
 92         public Prototype this[string name]
 93         {
 94             set 
 95             {
 96                 dic[name] = value;
 97             }
 98 
 99             get 
100             {
101                 return dic[name];
102             }
103         }
104     }
105    
106 }
107 

 

 类图:

 

 

ps:原型模式其实最早的应用不是计算机领域,而是中国古代的活字印刷术.

时间: 2024-11-05 14:40:16

温故而知新:设计模式之原型模式(Prototype)的相关文章

浅谈Java设计模式关于原型模式(Prototype)思索建议

java教程:关于Java设计模式关于原型模式(Prototype) IT信息技术http://www.52ij.com/jishu/ 首先需要弄清楚什么叫原型模式,或者说为什么要有原型模式,运用它会给我们带来什么或能解决什么问题?原型模式(Prototype)同抽象工厂模式同属于创建型模式,它主要关注于大量相同或相似对象的创建问题,应用原型模式就是先需要一个原对象,然后通过对原对象进行复制(克隆),来产生一个与原对象相同或相似的新对象.注意这里所说的对象相同不是指复制出来的副本对象与原对象是同

乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern)[索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. 示例 有一个Message实体类,现在要克隆它. MessageModel using System;using System.Collections.Generic;using System.Text;namespac

设计模式(四)原型模式Prototype(创建型)

设计模式(四)原型模式Prototype  1.   概述 我们都知道,创建型模式一般是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象. 例子1:孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:"给我寄个快递."顾客说."寄往什么地方?寄给--?"你问.&qu

C#设计模式(6)——原型模式(Prototype Pattern)

原文:C#设计模式(6)--原型模式(Prototype Pattern) 一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在内存中分配了多个一样的类实例对象,然后如果采用工厂模式来创建这样的系统的话,随着产品类的不断增加,导致子类的数量不断增多,反而增加了系统复杂程度,所以在这里使用工厂模式来封装类创建过程并不合适,然而原型模式可以很好地解决这个

.Net设计模式实例之原型模式( Prototype Pattern)

一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kind of objects to create using a prototypical instance, and create new objects by copying this prototype. 浅复制与深复制区别: 浅复制,被复制的所有变量都还有与原来对象相同的值,而所有的对其他对象的

设计模式之八(原型模式)

原文:设计模式之八(原型模式) 前言 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象. 结构图 Prototype,原型类,声明一个克隆自身的接口 ConcretePrototype1,ConcretePrototype2具体原型类,实现一个克隆自身的操作 Client,调用,让一个原型克隆自身从而创建一个新的对象 其实原型模式就是从一个对象再创建另外一个可定制的对象,而且不需知道任何创建的细节. 代码实现  Prototype原型类设计代码 public abstra

设计模式:原型模式(Prototype)

 原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.  举个例子: 1 原型(实际上是implements了Cloneable接口,进而重写clone()方法) public class ProtoType implements Cloneable { private String name; @Override public ProtoType clone() { try { return (ProtoType)super.clone(); } catch (Clone

学习php设计模式 php实现原型模式(prototype)_php技巧

一.意图 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象二.原型模式结构图 三.原型模式中主要角色 抽象原型(Prototype)角色:声明一个克隆自身的接口 具体原型(Concrete Prototype)角色:实现一个克隆自身的操作 四.原型模式的优点和缺点 Prototype模式优点: 1.可以在运行时刻增加和删除产品 2.可以改变值以指定新对象 3.可以改变结构以指定新对象 4.减少子类的构造 5.用类动态配置应用 Prototype模式的缺点: Prototype模式的

设计模式——5原型模式(Prototype)

5.原型模式(Prototype)原型模式虽然是创建型的模式,但是与工程模式没有关系,从名字即可看出,该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.本小结会通过对象的复制,进行讲解.在Java中,复制对象是通过clone()实现的,先创建一个原型类:[java] view plaincopy public class Prototype implements Cloneable { public Object clone() throws CloneNot