原型模式

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

分析:

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

创建新对象(也称为克隆对象)的工厂就是原型类自身,工厂方由负责复制原型对象的克隆方法来实现
通过克隆方法所创建的对象是全新的对象,它们在内存中拥有新的地址,每一个克隆对象都是独立
通过不同的方式对克隆对象进行修改以后,可以得到一系列相似但不完全相同的对象
 
原型模式的结构
原型模式包含以下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. 前端通过Blob实现文件下载

    最近遇到一个需求,需要将页面中的配置信息下载下来供用户方便使用,以前这个场景的需求有时候会放到后端处理,然后给返回一个下载链接.其实并不需要这么麻烦,这样既增大了服务器的负载,也让用户产生了没有必要的 ...

  2. Linux的权限属性信息1到10位分别什么意思

    要设置权限,就需要知道文件的一些基本属性和权限的分配规则. 在Linux中,ls命令常用来查看文件的属性,用于显示文件的文件名和相关属性. #ls -l 路径          [ls -l  等价于 ...

  3. codeforces E. DNA Evolution(树状数组)

    题目链接:http://codeforces.com/contest/828/problem/E 题解:就是开4个数组举一个例子. A[mod][res][i]表示到i位置膜mod余数是res的‘A’ ...

  4. codeforces 456 E. Civilization(并查集+数的直径)

    题目链接:http://codeforces.com/contest/456/problem/E 题意:给出N个点,M条边,组成无环图(树),给出Q个操作,操作有两种: 1 x,输出x所在的联通块的最 ...

  5. CodeForces round 520 div2

    A:A Prank 题意:给定一个递增序列, 问最多能删除多少个连续数字,要求删除数字之后能还原成原来的数列. 题解:直接找就好了,为了方便可以使得第0个数字为0, 第n+1个元素为1001 代码: ...

  6. Service:让客户端发现pod并与之通信

    5.1.Service介绍 5.1.1.Serice简介 5.1.1.1什么是Service service是k8s中的一个重要概念,主要是提供负载均衡和服务自动发现. Service 是由 kube ...

  7. SecureCRT安装及破解

    ### SecureCRT简介  > SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,简单地说是Windows下登录UNIX或Linux服务器主机的软件. > &g ...

  8. 工作中遇到的99%SQL优化,这里都能给你解决方案(二)

    -- 示例表 CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT NULL ...

  9. 题解 洛谷P1071【潜伏者】

    题目链接:https://www.luogu.org/problem/P1071 题意概括:给你一段原来截获的英文密码和与之对应的明文,如果密码表非F♂A法,输出"Failed"  ...

  10. 基于soot的java方法名生成报告

    0.生成XML格式文件 笔者使用soot将java文件解析生成xml格式文档,具体操作流程不再赘述.本文讨论执行结果的用途.笔者第一次采用的java文件如下:文件名为test.java 用soot解析 ...