温故而知新:设计模式之原型模式(Prototype)
原型模式个人以为最适合的场景:参照现有的某一个对象实例,快速得到多个完整的实例副本。(通常是深拷贝的副本)
深拷贝在c#中实现的最简单方式莫过于通过反序列化得到一个全新的对象实例。(当然如果浅拷贝的话,方法就很多了,比如利用MemberwiseClone或反射属性自动赋值都可以)
场景:还是游戏场景,就拿三国来说吧,打仗时可能需要小兵若干,每个小兵可能还要骑马...(简单起见其它东东就不提了,比如可能每个小兵还要带兵器若干),这些个实例的数量是动态的,
但是几乎每个小兵的属性都完全相同,每匹战马的属性也相同,很显然写一堆的new()造出若干实例,再逐一对属性赋值是可行的,但是并非最好的做法,下面看看原型的实现:
![](/assets/blank.gif)
![](/assets/blank.gif)
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:原型模式其实最早的应用不是计算机领域,而是中国古代的活字印刷术.
转载于:https://www.cnblogs.com/yjmyzz/archive/2010/01/27/design-pattern-prototype.html
温故而知新:设计模式之原型模式(Prototype)相关推荐
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
[索引页] [源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:webabcd 介绍 用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象. ...
- 设计模式之原型模式(Prototype)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式包括:1.FactoryMethod(工厂方法模式):2.Abstract Factory(抽象工厂模式):3.Sin ...
- 设计模式之原型模式prototype
1.原型模式的使用和本质.以及优势: a.通过 new 产生一个对象需要非常繁琐的数据准备或者访问权限,则可以使用原型模式. b.原型模式的使用就是 java 中的克隆技术,以某个对象为原型,复制出新 ...
- 【设计模式】—— 原型模式Prototype
前言:[模式总览]----------by xingoo 模式意图 由于有些时候,需要在运行时指定对象时哪个类的实例,此时用工厂模式就有些力不从心了.通过原型模式就可以通过拷贝函数clone一个原有的 ...
- java prototype是什么,java设计模式-原型模式(Prototype)
定义 原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是原型模式的用意 原型模式的结构 原型模式要求对象实现同一个可 ...
- 设计模式五: 原型模式(Prototype)
简介 原型模式是属于创建型模式的一种,是通过拷贝原型对象来创建新的对象. 万能的Java超类Object提供了clone()方法来实现对象的拷贝. 可以在以下场景中使用原型模式: 构造函数创建对象成本 ...
- C++设计模式——原型模式(Prototype Pattern)
C++设计模式--原型模式(Prototype Pattern) 微信公众号:幼儿园的学霸 目录 文章目录 C++设计模式--原型模式(Prototype Pattern) 目录 定义 代码示例 普通 ...
- 设计模式(23):创建型-原型模式(Prototype)
设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...
- C#设计模式(6)——原型模式(Prototype Pattern)
一.引言 在软件系统中,当创建一个类的实例的过程很昂贵或很复杂,并且我们需要创建多个这样类的实例时,如果我们用new操作符去创建这样的类实例,这未免会增加创建类的复杂度和耗费更多的内存空间,因为这样在 ...
最新文章
- 目标跟踪之粒子滤波---Opencv实现粒子滤波算法
- Neuron:迄今为止最大的颗粒细胞数据,发现海马齿状回神经元可过滤并放大空间信息...
- clock_gettime获取时间
- docker tensorflow-jupyter简单使用
- 数据结构之并查集Union-Find Sets
- html5大赛是什么,IE9开发大赛为HTML5打了一针兴奋剂
- 性能是.NET Core的一个关键特性
- 修改Sublime Text3 的侧边栏字体大小
- Mooc的Python3学习笔记
- react启动命令_十分钟搭建React开发环境
- std::atomic_thread_fence
- 踏踏实实学javascript--javascript中的变量
- kafka面试题简答
- ipad编程软件c语言2020,App Store 上的“计算机等级考试C语言版 2020最新”
- 什么是双线性映射(Bilinear Mapping )?
- 【Codecs系列】码率控制之VBV实现原理
- 福建省侨兴轻工学校计算机信息科,福建省侨兴轻工学校
- 2019年面试大概问题
- matlab 期权分析,matlab程序优化 (期权计算为例)
- 机器学习-21-Unsupervised Learning-05-Word Embedding(无监督学习之词嵌入)
热门文章
- Buffer I/O error on device mtdblock
- 互联网+智慧医疗:基于Python打造公益智慧医院项目之智能问答系统
- 前妻贾斯汀解读马斯克何以能“极度成功”:痴迷!痴迷!痴迷!
- python脚本分析apache访问日志
- ps2022 - add text
- QT 使用绝对坐标摆放控件
- 在Windows电脑直接申请iOS开发证书p12及.mobileprovision
- maven+springMVC+mysql+mybatis+velocity+事务整合
- Oracle 创建分页存储过程(转帖)
- GinCMS 使用golang Gin框架xorm开发的小型内容管理系统