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

简介: 原型模式个人以为最适合的场景:参照现有的某一个对象实例,快速得到多个完整的实例副本。(通常是深拷贝的副本) 深拷贝在c#中实现的最简单方式莫过于通过反序列化得到一个全新的对象实例。(当然如果浅拷贝的话,方法就很多了,比如利用MemberwiseClone或反射属性自动赋值都可以) 场景:还是游戏场景,就拿三国来说吧,打仗时可能需要小兵若干,每个小兵可能还要骑马.

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

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

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

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

img_1c53668bcee393edac0d7b3b3daff1ae.gif img_405b18b4b6584ae338e0f6ecaf736533.gif 原型模式代码示例-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 

 

 类图:

 img_ddb5187d943b6d92ab59f82cab31fd55.png

 

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

目录
相关文章
|
设计模式 JavaScript Java
【设计模式】【创建型模式】原型模式(Prototype)
一、入门 什么是原型模式? 原型模式(Prototype Pattern)是一种创建型设计模式,它通过复制现有对象来创建新对象,而不是通过实例化类。 原型模式的核心是克隆(Clone),即通过复制现有
353 15
|
设计模式 存储 Java
「全网最细 + 实战源码案例」设计模式——原型模式
原型模式(Prototype Pattern)是一种创建型设计模式,通过复制现有对象来创建新对象,适用于创建成本高或复杂的对象场景。其核心思想是“克隆”,避免直接实例化类。结构上分为抽象原型类、具体原型类和客户端。优点包括减少对象创建成本、隐藏复杂性、简化实例创建;缺点是处理循环引用的复杂对象时较为麻烦。实现步骤为定义原型类、重写`clone()`方法并调用。注意事项包括浅拷贝与深拷贝的区别及`Cloneable`接口的使用。
331 20
|
设计模式 Java 关系型数据库
【Java笔记+踩坑】设计模式——原型模式
对比原型模式和传统方式的实现思路、代码方案、优缺点,阐述原型模式的使用场景,以及深拷贝、浅拷贝等相关概念,并扩展原型模式在Spring源码中的应用。
【Java笔记+踩坑】设计模式——原型模式
|
设计模式 Java
Java设计模式-原型模式(3)
Java设计模式-原型模式(3)
230 0
Java设计模式-原型模式(3)
|
设计模式 JavaScript
js设计模式【详解】—— 原型模式
js设计模式【详解】—— 原型模式
288 6
|
设计模式
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
iLogtail设计模式问题之iLogtail中的原型模式是什么
|
设计模式 Java
Java设计模式之原型模式详解
Java设计模式之原型模式详解
|
设计模式
原型模式-大话设计模式
原型模式-大话设计模式
199 0
|
设计模式 Java Spring
设计模式——原型模式
设计模式——原型模式
|
设计模式 存储 架构师
设计模式-值类型与引用类型、深拷贝与浅拷贝、原型模式详解
 如果拷贝的时候共享被引用的对象就是浅拷贝,如果被引用的对象也拷贝一份出来就是深拷贝。(深拷贝就是说重新new一个对象,然后把之前的那个对象的属性值在重新赋值给这个用户)
395 0