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的更多相关文章

  1. 设计模式之第9章-原型模式(Java实现)

    设计模式之第9章-原型模式(Java实现) “快到春节了,终于快放假了,天天上班好累的说.”“确实啊,最近加班比较严重,项目快到交付了啊.”“话说一到过节,就收到铺天盖地的短信轰炸,你说发短信就发吧, ...

  2. 原型模式--java代码实现

    原型模式 原型模式,属于对象创建型模式中的一种.通过复制原型对象的方法来创建一个对象实例,且该对象与原对象有相同的数据结构和值.类似我们在备份数据库信息的时候,将数据库中表的结构和数据的一同备份,生成 ...

  3. 设计模式之原型模式——Java语言描述

    原型模式是用于创建重复对象,同时又能保证性能.这种类型的设计模式属于创建型模式,它提供了一种创建对象的方式 这种模式实现了一个原型接口,该接口用于创建当前对象的克隆.当直接创建对象的代价比较大时,则适 ...

  4. 原型模式 —— Java的赋值、浅克隆和深度克隆的区别

    赋值 直接  = ,克隆 clone 假如说你想复制一个简单变量.很简单: int a= 5; int b= a; b = 6; 这样 a == 5, b == 6 不仅仅是int类型,其它七种原始数 ...

  5. 深度分析:java设计模式中的原型模式,看完就没有说不懂的

    前言 原型模式(Prototype模式)是指:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象,无需知道如何创建的 ...

  6. java学习笔记之原型模式及深浅拷贝

    一.原型模式的基本介绍 在聊原型模式之前,我们来思考一个小问题,传统的方式我们是如何克隆对象呢? 那我们以多利羊(Sheep)为例,来说明上述这个问题,具体代码见下面: 多利羊(Sheep) publ ...

  7. java设计模式之原型模式

    原型模式概念 该模式的思想就是将一个对象作为原型,对其进行复制.克隆,产生一个和原对象类似的新对象.java中复制通过clone()实现的.clone中涉及深.浅复制.深.浅复制的概念如下: ⑴浅复制 ...

  8. Java设计模式5:原型模式

    原型模式 原型模式属于对象的创建模式,通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象,这就是原型模式的用意. 原型模式结构 原型模式要求对象实现一个 ...

  9. Java设计模式-原型模式(Prototype)

    原型模式属于对象的创建模式.通过给出一个原型对象来指明所有创建的对象的类型,然后用复制这个原型对象的办法创建出更多同类型的对象.这就是选型模式的用意. 原型模式的结构 原型模式要求对象实现一个可以“克 ...

随机推荐

  1. C++:只用初始化列表初始化变量的几种情况

    1.类成员函数中const变量的初始化(也就是第一点) 有几个容易混淆的地方: (1)const 的变量只能通过构造函数的初始化列表进行初始化:(貌似在C++11中可以正常编译) (2)static ...

  2. @noi.ac - 493@ trade

    目录 @description@ @solution@ @part - 1@ @part - 2@ @part - 3@ @part - 4@ @accepted code@ @details@ @d ...

  3. 使用jquery.form.js的ajaxsubmit方法提交数据的Bug

    周五同事遇到一个很奇怪的问题,调到下班,虽然问题解决了,但是不知道问题的具体原因,回来翻了翻代码,才发现症结所在,下面就分享出来,供遇到同样问题的同行们参考: 先把问题描述一下,做的功能是使用ajax ...

  4. Chrome接口请求一直是pending状态,但接口实际上是正常的

    1.现象 个别机器突然出现Chrome访问我司产品异常,本该通过接口获取的数据没有呈现,之前都是好好的,而且其他机器同样用同版本Chrome访问正常. 出现问题的机器重装Chrome问题依然存在,直到 ...

  5. linux中使用gbd进行单布调试

    在linux 中使用gdb命令行进行单步调试,将整个过程介绍如下: 1.在当前路径下新建文件夹main, 并进入文件夹,新建文件main.cpp mkdir main cd main touch ma ...

  6. img的alt和title的异同?

    alt 是图片加载失败时,显示在网页上的替代文字: title 是鼠标放上面时显示的文字,title是对图片的描述与进一步说明; 这些都是表面上的区别,alt是img必要的属性,而title不是. 对 ...

  7. 精选Pycharm里6大神器插件

    http://www.sohu.com/a/306693644_752099 上次写了一篇关于Sublime的精品插件推荐,有小伙伴提议再来一篇Pycharm的主题.相比Sublime,Pycharm ...

  8. Python--day63---出版社增删查改开发流程回顾

    1,第一步:对应url 2,第二步:views.py 3,第三步:views.py中的函数中利用ORM去数据库中操纵数据 4,第四步:Django模板语言实现字符串替换 5,第五步:取出publish ...

  9. pytorch实现BiLSTM+CRF用于NER(命名实体识别)

    pytorch实现BiLSTM+CRF用于NER(命名实体识别)在写这篇博客之前,我看了网上关于pytorch,BiLstm+CRF的实现,都是一个版本(对pytorch教程的翻译), 翻译得一点质量 ...

  10. H3C 高级ACL