博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式——原型模式
阅读量:5051 次
发布时间:2019-06-12

本文共 1844 字,大约阅读时间需要 6 分钟。

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

  原型模式其实就是对.NET中拷贝的一个应用模式,拷贝表面意思就是将对象拷贝一份,由于.NET中有引用类型和值类型两种类型,所以也分为浅拷贝和深拷贝这两种概念。

  先说下浅拷贝吧,在.NET中,引用类型会在创建时内存空间给动态分配一个内存。典型的引用类型就是创建一个对象,这个对象就是引用类型。当我们先实例化一个对象时,内存空间开辟一个空间存放这个对象。当再创建一个同类型的对象时,把先前创建的对象赋值给后创建的,也就是没执行new的操作,这是新创建的对象不会新开辟一个内存空间,而是把新对象指向原来对象的内存空间。这样就完成的浅拷贝的前提。

  而深拷贝,不仅赋值了对象的值,还再内存中再次开辟了一个空间,这样就变成了两个互不干涉的对象了。

1.Person类,提供了一些属性和一些方法,当然最重要的时提供了一个Clone的方法来实现对自身的拷贝。

1 ///  2 /// 定义一个Person类 3 ///  4 public class Person : ICloneable 5 { 6     private readonly string _word; 7     ///  8     /// 构造方法传入人要说的话 9     /// 10     /// 要说的话11     public Person(string word)12     {13         _word = word;14     }15     /// 16     /// 姓名17     /// 18     public string Name { get; set; }19 20     /// 21     /// 年龄22     /// 23     public int Age { get; set; }24 25     /// 26     /// 说话的方法27     /// 28     public void Say()29     {30         Console.WriteLine("{0},我叫{1},我{2}了", _word, Name, Age);31     }32     33     /// 34     /// 浅拷贝的克隆方法35     /// 36     /// 
37 public object Clone()38 {39 //进行浅拷贝的方法40 var wiseClonePerson = MemberwiseClone();41 return wiseClonePerson;42 }43 }
Person.cs

2.客户端代码,创建一个Person对象并赋值,然后新建一个对象并且调用Clone方法。这时候新person会有第一person的属性值和方法,做同样的事。

1 static void Main(string[] args) 2 { 3     var person = new Person("Hello world"); 4     person.Name = "张三"; 5     person.Age = 17; 6     person.Say(); 7     var person1 = (Person)person.Clone(); 8     person1.Say(); 9     Console.ReadKey();10 }
Program.cs

  我觉得,原型模式在设计实体类的时候比较好用,在定义实体类的时候,由于属性过多有时会很烦恼,假如我们假如层次结构,各个对象都没有关联,用一个统一类来管理。

比如定义个抽象类,抽象类里面实现了Clone的方法,每个实体类去继承这个抽象类,让后再新建一个管理类,每个实体类在管理类里面都有一个对象属性,那么管理类在上层就是通用的了,因为它包含了所有类的值。

                                                          以上内容部分参考程杰的《大话设计模式》一书

 

转载于:https://www.cnblogs.com/Smilodon/archive/2013/05/25/3099013.html

你可能感兴趣的文章
proc文件系统的简介
查看>>
连续自然数和
查看>>
[SDOI2015]星际战争
查看>>
用好lua+unity,让性能飞起来——luajit集成篇/平台相关篇
查看>>
JS控制页面跳转
查看>>
递归与循环的区别
查看>>
【USACO】Watering Hole 2008 Oct
查看>>
动态链接的步骤
查看>>
emacs 缩写词功能
查看>>
Api demo源码学习(2)--App/Activity/Custom Dialog --自定义Activity样式
查看>>
Velocity脚本简明教程
查看>>
虚拟机类加载机制
查看>>
RTSP流媒体数据传输的两种方式(TCP和UDP)
查看>>
大数n!
查看>>
TreeView控件使用总结
查看>>
PowerDesigner 生成的脚本取掉双引号
查看>>
改进卷积神经网络,你需要这14种设计模式
查看>>
Swap Nodes in Pairs
查看>>
js中数组以及for循环的使用
查看>>
「风格」与「设计」by杰夫·齐曼(Jeffrey Zeldman)
查看>>