原型模式

使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象

分析:

孙悟空:根据自己的形状复制(克隆)出多个身外身
软件开发:通过复制一个原型对象得到多个与原型对象一模一样的新对象
 
工作原理:将一个原型对象传给要发动创建的对象(即客户端对象),这个要发动创建的对象通过请求原型对象复制自己来实现创建过程

创建新对象(也称为克隆对象)的工厂就是原型类自身,工厂方由负责复制原型对象的克隆方法来实现
通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,每一个克隆对象都是独立
通过不同的方式对克隆对象进行修改以后,可以得到一系列相似但不完全相同的对象
 
原型模式的结构
原型模式包含以下3个角色:
•Prototype(抽象原型类)
•ConcretePrototype(具体原型类)
•Client(客户类)
 
浅克隆与深克隆
浅克隆(Shallow Clone)当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制
深克隆(Deep Clone)除了对象本身被复制外,对象所包含的所有成员变量也将被复制
     /// <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 就失去了原型模式的意义了

本文参考文档:https://www.cnblogs.com/genesis/p/6097528.html

23种设计模式之原型模式(Prototype Pattern)的更多相关文章

  1. 二十四种设计模式:原型模式(Prototype Pattern)

    原型模式(Prototype Pattern) 介绍用原型实例指定创建对象的种类,并且通过拷贝这个原型来创建新的对象.示例有一个Message实体类,现在要克隆它. MessageModel usin ...

  2. 乐在其中设计模式(C#) - 原型模式(Prototype Pattern)

    原文:乐在其中设计模式(C#) - 原型模式(Prototype Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 原型模式(Prototype Pattern) 作者:weba ...

  3. 23种设计模式之原型模式(Prototype)

    在系统开发过程中,有时候有些对象需要被频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后通过复制这个原型对象的办法,创建出更多同类型的对象.原型模式是一种对象创建型模式,用原型实例 ...

  4. 【Unity与23种设计模式】原型模式(Prototype)

    GoF中定义: "使用原型对象来产生指定类的对象,所以产生对象时,是使用复制原型对象来完成." Unity中 开发者可以组装游戏对象 它可以包括复杂的组件 组装好了之后,就可以将其 ...

  5. python 设计模式之原型模式 Prototype Pattern

    #引入 例子1: 孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来. 例子2:寄个快递下面是一个邮寄快递的场景:“给我寄个快递.”顾客说.“寄往什么地方?寄给……?”你问.“和上次差不多一样,只是邮 ...

  6. 【UE4 设计模式】原型模式 Prototype Pattern

    概述 描述 使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.如孙悟空猴毛分身.鸣人影之分身.剑光分化.无限剑制 原型模式是一种创建型设计模式,允许一个对象再创建另外一个可定制的对象, ...

  7. 23种设计模式--中介者模式-Mediator Pattern

    一.中介者模式的介绍     中介者模式第一下想到的就是中介,房子中介,婚姻中介啊等等,当然笔者也希望来个婚姻中介给我介绍一个哈哈哈,,回归正题中介者模式分成中介者类和用户类,根据接口编程的方式我们再 ...

  8. Net设计模式实例之原型模式( Prototype Pattern)

    一.原型模式简介(Brief Introduction) 原型模式(Prototype Pattern):用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象. Specify the kin ...

  9. 设计模式系列之原型模式(Prototype Pattern)——对象的克隆

    说明:设计模式系列文章是读刘伟所著<设计模式的艺术之道(软件开发人员内功修炼之道)>一书的阅读笔记.个人感觉这本书讲的不错,有兴趣推荐读一读.详细内容也可以看看此书作者的博客https:/ ...

随机推荐

  1. 关于ionic app $http.get()无法请求,导致页面没有数据的问题

    ionic app 打包后在真机上运行,无法用正常使用http.get(),这种情况被称为“白名单”,解决方法:切换到项目根目录,执行命令:cordova plugin add cordova-plu ...

  2. Codeforces 936C

    题意略. 思路: 这个题目没做出来是因为缺少一个整体的构造思路. 正确的构造思路是不断地在s中去构造并且扩大t的后缀,构造好的后缀总是放在前面,然后不断地把它往后挤,最后将s构造成t. 比如: 现在在 ...

  3. Delphi - cxGrid内容xlsx、xls、csv格式导出

    .xls格式导出,uses中添加cxGridExportLink 代码如下: function SaveToExcel(gridMain: TcxGrid; FileName: string): st ...

  4. 将excel中某列数据中,含有指定字符串的记录取出,并生成用这个字符串命名的txt文件

    Python 一大重要的功能,就是可处理大量数据,那分不开的即是使用Excel表格了,这里我做下学习之后的总结,望对我,及广大同仁们是一个帮助Python处理Excel数据需要用到2个库:xlwt 和 ...

  5. JavaScript img标签自带的onload和onerror函数

    onload 加载完成时调用触发 原生: <img src="" alt="Park" onload=“handleImageLoaded()”/> ...

  6. gym/101873/GCPC2017

    题目链接:https://codeforces.com/gym/101873 C. Joyride 记忆化搜索形式的dp #include <algorithm> #include < ...

  7. POJ 3694 Network 无向图双联通+LCA

    一开始题目没看清楚,以为是增加那条边后还有多少桥,所以就当做是无向图tarjan缩点后建树,然后求u,v的最近公共祖先,一直wa. 后来再看题目后才发现边放上去后不会拿下来了,即增加i条边后桥的数量. ...

  8. HDU2874 Connections between cities 最近公共祖先

    第一次按常规的方法求,将所有的查询的u,v,和最近公共祖先都保存起来,然后用tarjan+并查集求最近公共祖先.因为询问的次数过多,所以在保存查询的时候总是MLE,后来参考了一下别人的代码,才突然觉悟 ...

  9. 计蒜客 ACM训练联盟周赛 第一场 Christina式方格取数 思维

    助手Christina发明了一种方格取数的新玩法:在n*m的方格棋盘里,每个格子里写一个数.两个人轮流给格子染色,直到所有格子都染了色.在所有格子染色完后,计算双方的分数.对于任意两个相邻(即有公共边 ...

  10. MySQL连接方式小结

    1.   连接方式 1.1  方式1 /usr/local/mysql5./bin/mysql -p 此方法默认采用root@localhost用户登录, 1.2  方式2 /usr/local/my ...