温故而知新:设计模式之原型模式(Prototype)
时间:2022-04-23
本文章向大家介绍温故而知新:设计模式之原型模式(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:原型模式其实最早的应用不是计算机领域,而是中国古代的活字印刷术.
- 深度学习对话系统实战篇 -- 简单 chatbot 代码实现
- pangrank算法--PageRank算法并行实现
- 刷爆朋友圈的 deepfakes 视频人物换脸是怎样炼成的?
- 干货 | ElasticSearch相关性打分机制
- FCN 的简单实现
- 2.运行一个demo
- ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY COL2)/ ROWNUMBER() OVER( PARTITION BY COL1 ORDER BY CO
- 干货 | 前端常用的通信技术
- TP-LINK WR941N路由器研究
- ORA-01113问题的简单分析(r6笔记第3天)
- Tensorflow 中 learning rate decay 的奇技淫巧
- hive数据:名词解释
- 巧妙使用exchange partition的一个案例(r6笔记第1天)
- r与rjava
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 宋宝华:Linux设备与驱动的手动解绑与手动绑定
- ELK7.x日志系统搭建 1. elk基础搭建
- 腾讯云直播开发日记 (二)附近直播-直播礼物-直播回放
- 腾讯云直播开发日记(三) 聊天室-直播转码-连麦混流
- c#类(class)
- es 7.2 生产集群 index 无数据写入故障定位
- HashMap都在用,原理你真的了解吗?
- Android必知必会--事件分发机制
- 又被逼着优化代码,这次我干掉了出入参 Log日志
- C#委托进阶,事件和委托,一次就看明白,附源码
- 树莓派爬虫多平台热搜榜轮播展示
- Scrapy 和 Pyppeteer 更优雅的对接方案
- 京喜前端自动化测试之路(小程序篇)
- JavaScript 混淆与逆向必读之 AST 节点类型名词基础
- 手把手教你如何实现大量图片的自适应图片页面的排列