【设计模式】——原型模式
2015-12-16 19:30
274 查看
设计模式:
定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其实就是从一个对象再创建另一个可定制的对象,而且不需知道任何创建的细节,通过该方法返回一个对象的副本通过工厂封装具体的
new操作的过程,返回一个新的对象)。即:复制。
结构图:
解释:
客户(Client)角色:克隆自身从而创建一个新的对象。
抽象原型(Prototype)角色:这是一个抽象角色,通常由一个C#接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在C#中,抽象原型角色通常实现了ICloneable接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。
优点:
1)使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
2)简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。
3)不用初始化对象,而是动态的获得对象运行时的状态。
缺点:
每一个Prototype的子类都必须实现clone操作,这可能很困难。例如,当所考虑的类已经存在时就难以新增 clone操作。当内部包括一些不支持拷贝或有循环引用的对象时,实现克隆可能也会很困难的。
代码实现:
客户端:
简历:
浅复制VS深复制:
MemberwiseClone()F方法:创建当前对象的浅表副本。创建一个新对象,将当前对象的非静态字段复制到该字段下。如果字段是值类型则对该字段执行逐位复制,如果是引用类型,则赋值引用而不复制引用的对象。,所以原始对象及其副本引用同一对象。
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
深复制:把所有引用对象的变量纸箱复制过的新对象,而不是原来的被引用的对象。
其实也就是浅复制是复制了地址,深复制是把地址和地址对应的内容都复制了过去。
推荐:《原型模式——创建型》
定义:
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。其实就是从一个对象再创建另一个可定制的对象,而且不需知道任何创建的细节,通过该方法返回一个对象的副本通过工厂封装具体的
new操作的过程,返回一个新的对象)。即:复制。
结构图:
解释:
客户(Client)角色:克隆自身从而创建一个新的对象。
抽象原型(Prototype)角色:这是一个抽象角色,通常由一个C#接口或抽象类实现。此角色给出所有的具体原型类所需的接口。在C#中,抽象原型角色通常实现了ICloneable接口。
具体原型(Concrete Prototype)角色:被复制的对象。此角色需要实现抽象的原型角色所要求的接口。
优点:
1)使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。
2)简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。
3)不用初始化对象,而是动态的获得对象运行时的状态。
缺点:
每一个Prototype的子类都必须实现clone操作,这可能很困难。例如,当所考虑的类已经存在时就难以新增 clone操作。当内部包括一些不支持拷贝或有循环引用的对象时,实现克隆可能也会很困难的。
代码实现:
客户端:
static void Main(string[] args) { Resume a = new Resume("大鸟"); a.SetPersonalInfo("男", "29"); a.SetWorkExpriece("1999-2000", "好人公司"); Resume b = (Resume)a.Clone(); a.SetWorkExpriece("1999-2000", "好人公司"); Resume c = (Resume)a.Clone(); a.SetWorkExpriece("1999-2000", "好人公司"); a.Display(); b.Display (); c.Display(); Console.Read(); }
简历:
class Resume:ICloneable { private string name; private string sex; private string age; private string timeArea; private string company; public Resume(string name) { this.name = name; } //设置个人信息 public void SetPersonalInfo(string sex, string age) { this.sex = sex; this.age = age; } //设置工作经历 public void SetWorkExpriece(string timeArea, string company) { this.timeArea = timeArea; this.company = company; } //显示 public void Display() { Console.WriteLine("{0}{1}{2}",name,sex,age ); Console.WriteLine("工作经历:{0}{1}",timeArea ,company ); } public object Clone() { return (object)this.MemberwiseClone(); } }
浅复制VS深复制:
MemberwiseClone()F方法:创建当前对象的浅表副本。创建一个新对象,将当前对象的非静态字段复制到该字段下。如果字段是值类型则对该字段执行逐位复制,如果是引用类型,则赋值引用而不复制引用的对象。,所以原始对象及其副本引用同一对象。
浅复制:被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象。
深复制:把所有引用对象的变量纸箱复制过的新对象,而不是原来的被引用的对象。
其实也就是浅复制是复制了地址,深复制是把地址和地址对应的内容都复制了过去。
推荐:《原型模式——创建型》
相关文章推荐
- 数据结构之归并排序
- 显式intent和隐式intent的注册
- 删除本地过期图pain
- android appcompat-v7包引发的错误
- 如何在form:input中添加spring message code
- 通讯录 、 传感器
- 1225 数数字
- stand up meeting for beta release plan 12/16/2015
- Linux mysql
- 深入浅出:Linux设备驱动之字符设备驱
- 欢迎使用CSDN-markdown编辑器
- 让程序分别在DEBUG模式和RELEASE模式选择不同代码路径的方法 _DEBUG
- 点击按钮实现图片的切换
- 照片和音频 、 系统邮件、短信
- python --正则学习
- Android ListView分类/分组效果 - 第二种实现方式
- [原创]TFS如何强制撤销别人的机器签出的文件
- React Native资料汇总
- 高中数学必修2 之 立体几何初步
- Gcc对头文件与库文件的搜索路径