PrototypePattern(原型模式)-----Java/.Net
1.介绍
原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,
根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,
这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。
2.示例
[Serializable]
public class StudentProperty
{
private StudentProperty()//让我们创建对象的时候,麻烦一点
{
long lRsult = 0;
for (int i = 0; i < 1000000000; i++)
{
lRsult += i;
}
Console.WriteLine("构造函数计算完成 {0}", lRsult);
}
private static StudentProperty _StudentProperty = null; static StudentProperty()
{
_StudentProperty = new StudentProperty();
_StudentProperty.Name = "tumi";
_StudentProperty.Class = new Advanced()
{
Id = 1,
Name = "Advanced"
};
} /// <summary>
/// 原型模式:解决对象重复创建的问题
/// 通过MemberwiseClone来clone新对象,内存操作,直接复制的,避免重复创建
/// </summary>
/// <returns></returns>
public static StudentProperty Clone()
{
StudentProperty studentCopy = (StudentProperty)_StudentProperty.MemberwiseClone();
return studentCopy;
} public int Id { get; set; }
public string Name { get; set; }
public DateTime Now { get; set; }
public Advanced Class { get; set; } } [Serializable]
public class Advanced
{
public int Id { get; set; }
public string Name { get; set; } }
public class SerializeHelper
{
public static string Serializable(object target)
{
using (MemoryStream stream = new MemoryStream())
{
new BinaryFormatter().Serialize(stream, target); return Convert.ToBase64String(stream.ToArray());
}
} public static T Derializable<T>(string target)
{
byte[] targetArray = Convert.FromBase64String(target); using (MemoryStream stream = new MemoryStream(targetArray))
{
return (T)(new BinaryFormatter().Deserialize(stream));
}
} public static T DeepClone<T>(T t)
{
return Derializable<T>(Serializable(t));
}
}
/// <summary>
/// 1 原型模式
/// 2 浅表复制和深表复制
/// </summary>
class Program
{
static void Main(string[] args)
{ StudentProperty studentProperty1 = StudentProperty.Clone();
studentProperty1.Name = "One";
studentProperty1.Id = 1;
studentProperty1.Now = DateTime.Now; StudentProperty studentProperty2 = StudentProperty.Clone();
studentProperty2.Name = "Two";
studentProperty2.Id = 2;
studentProperty2.Now = DateTime.Now.AddDays(1); studentProperty2.Class.Name = "ClassName"; StudentProperty studentProperty3 = SerializeHelper.Derializable<StudentProperty>(SerializeHelper.Serializable(studentProperty2));//借助序列化,实现深克隆
studentProperty3.Class.Name = "ClassName"; Console.Read();
}
}
PrototypePattern(原型模式)-----Java/.Net的更多相关文章
- 设计模式之第9章-原型模式(Java实现)
设计模式之第9章-原型模式(Java实现) “快到春节了,终于快放假了,天天上班好累的说.”“确实啊,最近加班比较严重,项目快到交付了啊.”“话说一到过节,就收到铺天盖地的短信轰炸,你说发短信就发吧, ...
- 原型模式--java代码实现
原型模式 原型模式,属于对象创建型模式中的一种.通过复制原型对象的方法来创建一个对象实例,且该对象与原对象有相同的数据结构和值.类似我们在备份数据库信息的时候,将数据库中表的结构和数据的一同备份,生成 ...
- 设计模式之原型模式——Java语言描述
原型模式是用于创建重复对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的方式 这种模式实现了一个原型接口,该接口用于创建当前对象的克隆.当直接创建对象的代价比较大时,则适 ...
- 原型模式 —— Java的赋值、浅克隆和深度克隆的区别
赋值 直接 = ,克隆 clone 假如说你想复制一个简单变量.很简单: int a= 5; int b= a; b = 6; 这样 a == 5, b == 6 不仅仅是int类型,其它七种原始数 ...
- 深度分析:java设计模式中的原型模式,看完就没有说不懂的
前言 原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的 ...
- java学习笔记之原型模式及深浅拷贝
一.原型模式的基本介绍 在聊原型模式之前,我们来思考一个小问题,传统的方式我们是如何克隆对象呢? 那我们以多利羊(Sheep)为例,来说明上述这个问题,具体代码见下面: 多利羊(Sheep) publ ...
- java设计模式之原型模式
原型模式概念 该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.java中复制通过clone()实现的.clone中涉及深.浅复制.深.浅复制的概念如下: ⑴浅复制 ...
- Java设计模式5:原型模式
原型模式 原型模式属于对象的创建模式,通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的用意. 原型模式结构 原型模式要求对象实现一个 ...
- Java设计模式-原型模式(Prototype)
原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是选型模式的用意. 原型模式的结构 原型模式要求对象实现一个可以“克 ...
随机推荐
- 威胁快报|新兴挖矿团伙借助shodan作恶,非web应用安全再鸣警钟
近日,阿里云安全发现了一个使用未授权访问漏洞部署恶意Docker镜像进行挖矿的僵尸网络团伙.我们给这一团伙取名为Xulu,因为该团伙使用这个字符串作为挖矿时的用户名. Xulu并不是第一个攻击Dock ...
- OpenStack☞网关协议
一 动态页面与静态页面区别 静态页面:每一个网页都有一个固定的URL,且网页的URL以.html..htm..shtml等常见的形式为后缀. 网页内容已经发布到网站服务器上,无论是否有用户访问,每个静 ...
- 两个[\\s\\S]*?之间可为空元素没有意义
两个[\\s\\S]*?之间的* ? {0,n}等元素无效,即使出现这样的元素,也会被当做[\\s\\S]*?处理,[\\s\\S]*+也类似 除非两个[\\s\\S]*?之间设置必定出现的元素才有意 ...
- sublime 插件安装packagecontrol
https://packagecontrol.io/installation 第一步: Installation Simple The simplest method of installation ...
- 深入python
while循环知识: while是关键字 格式我们要怎么写:; while 条件 : 缩进 循环(代码块) 这里面有个死循环######条件如果一直为真,就形成了一个环,就成为了死循环 那我们如 ...
- Java多线程遍历文件夹,广度遍历加多线程加深度遍历结合
复习IO操作,突然想写一个小工具,统计一下电脑里面的Java代码量还有注释率,最开始随手写了一个递归算法,遍历文件夹,比较简单,而且代码层次清晰,相对易于理解,代码如下:(完整代码贴在最后面,前面是功 ...
- LRJ
//3-1 #define _CRT_SECURE_NO_WARNINGS #include <cstdio> int main() { int T; ]; scanf("%d& ...
- 基于ThinkPHP与阿里大于的PHP短信验证功能
https://blog.csdn.net/s371795639/article/details/53381274 PHP阿里大鱼短信验证 第一步 登陆阿里大于注册账号,在用户管理中心创建应用,确定A ...
- Python--day62--删除出版社
删除成出版社关键代码:
- 2019-9-22-dotnet-core-导出-COM-组件
title author date CreateTime categories dotnet core 导出 COM 组件 lindexi 2019-09-22 20:25:38 +0800 2019 ...