1.原型模式

  用原型实例指定创建对象的实例,并且通过拷贝这些原型创建新的对象。

*原型模式隐藏了创建对象的细节,提高了性能。

*浅复制:被复制对象的所有变量都含有与原来对象相同的值,而且所有对其他对象的引用都指向了原来的对象。

*深复制:被复制对象的引用指向了新的对象,而不是原有的被引用的对象。

*.NET提供IConeable接口下的唯一方法Clone可以便捷的完成原型模式的实现。


2.实例:

namespace 原型模式_浅复制
{
class Program
{
static void Main(string[] args)
{
Resume a = new Resume("大鸟");
a.SetPersonalInfo("男", "");
a.SetWorkExperience("", "xx公司"); Resume b = (Resume)a.Clone();
b.SetWorkExperience("男", "yy公司"); a.Display();
b.Display();//浅复制下使得引用的复制指向相同空间,a的工作经验被b覆盖 Console.Read();
}
} class WorkExperience
{
private string workDate;
public string WorkData
{
get { return workDate; }
set { workDate = value; }
} private string company;
public string Company
{
get { return company; }
set { company = value; }
}
} class Resume : ICloneable
{
private string name;
private string sex;
private string age; private WorkExperience work; public Resume(string name)
{
this.name = name;
work = new WorkExperience();
} public void SetPersonalInfo(string sex,string age)
{
this.sex = sex;
this.age = age;
} public void SetWorkExperience(string workData,string Company)
{
work.WorkData = workData;
work.Company = Company;
} public void Display()
{
Console.WriteLine("{0} {1} {2}", name, sex, age);
Console.WriteLine("浅复制:{0} {1}", work.WorkData, work.Company);
} public object Clone()
{
return (object)this.MemberwiseClone();
}
}
}

此时的输出结果a,b所有细节一致。

namespace 原型模式_深复制
{
class Program
{
static void Main(string[] args)
{
Resume a = new Resume("大鸟");
a.SetPersonalInfo("男", "");
a.SetWorkExperience("", "xx公司"); Resume b = (Resume)a.Clone();
b.SetWorkExperience("男", "yy公司"); a.Display();
b.Display();//浅复制下使得引用的复制指向相同空间,a的工作经验被b覆盖 Console.Read();
}
} class WorkExperience : ICloneable
{
private string workDate;
public string WorkData
{
get { return workDate; }
set { workDate = value; }
} private string company;
public string Company
{
get { return company; }
set { company = value; }
} public Object Clone()
{
return (object) this.MemberwiseClone();
}
} class Resume : ICloneable
{
private string name;
private string sex;
private string age; private WorkExperience work; public Resume(string name)
{
this.name = name;
work = new WorkExperience();
} public Resume (WorkExperience work)
{
this.work = (WorkExperience)work.Clone();
} public void SetPersonalInfo(string sex, string age)
{
this.sex = sex;
this.age = age;
} public void SetWorkExperience(string workData, string Company)
{
work.WorkData = workData;
work.Company = Company;
} public void Display()
{
Console.WriteLine("{0} {1} {2}", name, sex, age);
Console.WriteLine("深复制:{0} {1}", work.WorkData, work.Company);
} public object Clone()
{
Resume obj = new Resume(this.work);
obj.name = this.name;
obj.sex = this.sex;
obj.age = this.age; return obj;
}
}
}

b中修改工作经验中的属性后a中不受影响。

(C#)原型模式—深复制与浅复制的更多相关文章

  1. clone()方法、深复制和浅复制

    clone方法 Java中没有明确提供指针的概念和用法,而实质上没个new语句返回的都是一个指针的引用,只不过在大部分情况下开发人员不需要关心如何去操作这个指针而已. 在实际编程中,经常会遇到从某个已 ...

  2. .Net深复制、浅复制

    在.Net,大家都知道引用类型的深复制.浅复制吧. ,一般int等值类型是值类型(复制时是直接传值),一般的类(List<T>,Class)是引用类型(复制时传地址),默认是浅复制.若ob ...

  3. C++学习基础七——深复制与浅复制

    一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和char *str两个成员变量, 当深 ...

  4. php对象当参数传递 && php深复制和浅复制

    把对象当参数传递给方法,在方法里改过对象后,影响到外面的对象  因为对象是引用传递过去的 class Book { public $name; public function __construct( ...

  5. iOS 集合的深复制与浅复制

    概念 对象拷贝有两种方式:浅复制和深复制.顾名思义,浅复制,并不拷贝对象本身,仅仅是拷贝指向对象的指针:深复制是直接拷贝整个对象内存到另一块内存中. 一图以蔽之 再简单些说:浅复制就是指针拷贝:深复制 ...

  6. Java中对象的深复制和浅复制详解

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵ ...

  7. Java中的深复制与浅复制

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不 复制它所引用的对象. ...

  8. C#深复制和浅复制

    本文在于巩固基础 我们来看看什么是深复制.浅复制: C#中对于数据的复制机制虽然简单但是容易让人误解.C#数据类型大体分为值类型(value type)与引用类型(reference type).对于 ...

  9. C#深复制与浅复制

    C#深复制与浅复制 C#中对于数据的复制机制虽然简单但是容易让人误解.C#数据类型大体分为值类型(value type)与引用类型(reference type).对于值类型数据,复制的时候直接将数据 ...

  10. iOS 之 深复制、浅复制

    深复制不仅复制对象本身,对象持有的属性对象也做了复制. 浅复制之复制对象本身,不对里面的属性进行复制.

随机推荐

  1. phpStudy环境安装SSL证书教程(apache)

    https://cloud.tencent.com/product/ssl 此链接是检测域名 证书的可以检测一下 下面是证书配置 小白呢亲测 作为PHP程序员,我们一定要学会使用phpStudy环境集 ...

  2. 复习宝典之Redis

    查看更多宝典,请点击<金三银四,你的专属面试宝典> 第八章:Redis Redis是一个key-value的nosql数据库.先存到内存中,会根据一定的策略持久化到磁盘,即使断电也不会丢失 ...

  3. IIS网站的应用程序与虚拟目录的区别及应用

    IIS网站 一个网站可以新建无数个应用程序和目录 应用程序 同一域名下程序的独立开发,独立部署的最佳应用策略. 应用程序的应用场景: 1. 域名的分布 比如:www.baidu.com,对于后台,我们 ...

  4. PHP中call user func()和call_user_func_array()调用自定义函数小结

    call_user_func() 和 call_user_func_array(),通过传入字符串函数,可以调用自定义函数,并且支持引用,都允许用户调用自定义函数并传入一定的参数: 1.mixed c ...

  5. WARNING: IPv4 forwarding is disabled. Networking will not work.

    1:Test environment [root@docker-node1 ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Cor ...

  6. 慎使用sql的enum字段类型

    在sql的优化中,会有同学提到一点:使用enum字段类型,代替其他tinyint等类型.以前这也是不少人喜欢优化的,但是现在细想,是非常不合理的. 优点: 1.可以设置区间范围,比如设置性别:1男2女 ...

  7. Spark运行模式_基于YARN的Resource Manager的Custer模式(集群)

    使用如下命令执行应用程序: 和"基于YARN的Resource Manager的Client模式(集群)"运行模式,区别如下: 在Resource Manager端提交应用程序,会 ...

  8. python和java,php,c,c#,c++的对比

    1.C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素.C++在这方面做了改进,在保 ...

  9. VXLAN简介(摘抄)

    VXLAN简介 VXLAN:Virtual eXtensible Local Area Network的缩写,虚拟扩展局域网,现代数据中心的的一种网络虚拟化技术,即在传统的三层IP网络上虚拟出一张二层 ...

  10. centos配置NTP服务器

    时间服务器: NTP(Network Time Protocol,网络时间协议)是用来使用网络中的各个计算机时间同步的一种协议,NTP服务器就是利用NTP协议提供时间同步服务的. 一.环境准备: 1. ...