23种设计模式之原型模式(Prototype Pattern)
原型模式
使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象
分析:
/// <summary>
/// 原型模式:单例的基础上升级了一下,把对象从内存层面复制了一下,然后返回
/// 是个新对象,但是又不是new出来的
/// </summary>
[Serializable]
public class Prototype
{
/// <summary>
/// 构造函数耗时耗资源
/// </summary>
private Prototype()
{
long lResult = ;
for (int i = ; i < ; i++)
{
lResult += i;
}
Thread.Sleep();
Console.WriteLine("{0}被构造一次", this.GetType().Name);
}
/// <summary>
/// 3 全局唯一静态 重用这个变量
/// </summary>
private static volatile Prototype _Prototype = new Prototype()
{
CurrentEmployee = "admin",
Member = new Member { Id=,Name="aaa"}
};
/// <summary>
/// 2 公开的静态方法提供对象实例
/// </summary>
/// <returns></returns>
public static Prototype CreateInstance()
{
Prototype prototype = (Prototype)_Prototype.MemberwiseClone();
return prototype;
}
public static Prototype DeepClone()
{
Prototype prototype = JsonConvert.DeserializeObject<Prototype>(JsonConvert.SerializeObject(_Prototype));
return prototype;
}
public Member Member { get; set; }
public string CurrentEmployee { get; set; }
}
[Serializable]
public class Member
{
public int Id { get; set; }
public string Name { get; set; }
}
前端调用
{//浅拷贝
Prototype prototype1 = Prototype.CreateInstance();
Prototype prototype2 = Prototype.CreateInstance();
prototype1.CurrentEmployee = "prototype1";
prototype1.Member.Id = ;
prototype1.Member.Name = "bbb";
prototype2.CurrentEmployee = "prototype2";
prototype2.Member.Id = ;
prototype2.Member.Name = "ccc";
Console.WriteLine(prototype1.CurrentEmployee);
Console.WriteLine(prototype1.Member.Id);
Console.WriteLine(prototype1.Member.Name);
Console.WriteLine(prototype2.CurrentEmployee);
Console.WriteLine(prototype2.Member.Id);
Console.WriteLine(prototype2.Member.Name);
}
{//深拷贝
Prototype prototype1 = Prototype.DeepClone();
Prototype prototype2 = Prototype.DeepClone();
prototype1.CurrentEmployee = "prototype1";
prototype1.Member.Id = ;
prototype1.Member.Name = "bbb";
prototype2.CurrentEmployee = "prototype2";
prototype2.Member.Id = ;
prototype2.Member.Name = "ccc";
Console.WriteLine(prototype1.CurrentEmployee);
Console.WriteLine(prototype1.Member.Id);
Console.WriteLine(prototype1.Member.Name);
Console.WriteLine(prototype2.CurrentEmployee);
Console.WriteLine(prototype2.Member.Id);
Console.WriteLine(prototype2.Member.Name);
}
执行结果
深度拷贝就是利用序列化与反序列化创建对象,这种方法好像也走构造函数,那么还不如直接new 就失去了原型模式的意义了
23种设计模式之原型模式(Prototype Pattern)的更多相关文章
- 二十四种设计模式:原型模式(Prototype Pattern)
原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...
- 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)
原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...
- 23种设计模式之原型模式(Prototype)
在系统开发过程中,有时候有些对象需要被频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后通过复制这个原型对象的办法,创建出更多同类型的对象.原型模式是一种对象创建型模式,用原型实例 ...
- 【Unity与23种设计模式】原型模式(Prototype)
GoF中定义: "使用原型对象来产生指定类的对象,所以产生对象时,是使用复制原型对象来完成." Unity中 开发者可以组装游戏对象 它可以包括复杂的组件 组装好了之后,就可以将其 ...
- python 设计模式之原型模式 Prototype Pattern
#引入 例子1: 孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:“给我寄个快递.”顾客说.“寄往什么地方?寄给……?”你问.“和上次差不多一样,只是邮 ...
- 【UE4 设计模式】原型模式 Prototype Pattern
概述 描述 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.如孙悟空猴毛分身.鸣人影之分身.剑光分化.无限剑制 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, ...
- 23种设计模式--中介者模式-Mediator Pattern
一.中介者模式的介绍 中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再 ...
- Net设计模式实例之原型模式( Prototype Pattern)
一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...
- 设计模式系列之原型模式(Prototype Pattern)——对象的克隆
说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...
随机推荐
- C#数据结构_排序
/** * 冒泡排序 * * @param array * @return */ public static int[] bubbleSort(int[] array) { if (array.len ...
- 使用css实现水平垂直居中
1.通过absolute和margin实现(适用于弹窗,具体位置随浏览器屏幕大小变化改变)这种方式需要居中元素的父级必须采用绝对定位或相对定位,被居中元素的尺寸需要固定. <div class= ...
- 10_switch语句的使用
/* switch 语句和c语言的用法不同 1.go语句是默认添加break语句的,但c不是默认的 2.go语句添加一个fallthrough语句,可以顺序执行接下来的结构 3.switch在关键词后 ...
- Hadoop3.1.2 + Hbase2.2.0 设置lzo压缩算法
Hadoop3.1.2 + Hbase2.2.0 设置lzo压缩算法: 写在前面,在配置hbase使用lzo算法时,在网上搜了很多文章,一般都是比较老的文章,一是版本低,二是一般都是使用hadoop- ...
- 简单详细讲解js闭包(看完不懂你砍我!!!)
<javascript高级程序设计>中闭包的概念: 闭包,其实是一种语言特性,它是指的是程序设计语言中,允许将函数看作对象,然后能像在对象中的操作般在函数中定义实例(局部)变量,而这些变量 ...
- c#搭建jenkins自动构建环境
这边我使用的是参数化构建过程,文笔比较差劲,就直接上干货了 1.定义构造参数 2.设置jenkins工作空间目录,在此定义了版本号和工作目录构建参数 3.配置svn 4.构建触发器,用于轮询查看svn ...
- 【百度之星】【思维】hdu 6724Totori's Switching Game
思维题,最后只要判断每个点的度数>=k即可. #pragma comment(linker, "/STACK:1024000000,1024000000") #pragma ...
- 51NOD---逆序对(树状数组 + 归并排序)
1019 逆序数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称 ...
- Redis哨兵模式实现集群的高可用
先了解一下哨兵都 做了什么工作:Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务: 监控(Monitoring): Sentinel ...
- vim中处理重定向文件中的^H和^M
做实验的时候会把日志重定向写到文件中,方便以后查看.但是用vim打开之后出现很多^H和^M,就像乱码一样.如图所示: 现在尝试在vim中解决这个问题. 替换^H 在vim中输入命令,表示把^H替换成空 ...