• 原型模式(Prototype)


    1.原型模式涉及到两个重要概念:浅复制、深复制

    ①.所谓浅复制,针对值类型,是逐位复制(即连同值一起复制),而对于引用类型,则只复制对对象的引用(即只是获得了该对象的另一个指针),不会复制对象中的变量,需要说明的是,string类型是具有值类型特性的引用类型,即:虽然按照上述定义浅复制下只复制了引用,但对于string却是连同值都复制了,需要注意

    ②.所谓深复制,就是无论值类型还是引用类型,所有变量都复制了

    2.原型模式实现了对象的复制,这在一些场合下是能提高效率的,比如:对象的创建过程回去调用构造函数,如果这个构造函数中需要执行很多操作,无疑就对执行效率有了较大影响,同时考虑:大多数初始化信息应该都是一致的,这是使用原型模式去创建统一结构的对象,之后再针对个性化信息做些修改,对效率将是大大的提高(同时,统一的信息部分也避免了出错)。

    3.由于原型模式的通用性,.net下对其进行了封装,只要类实现ICloneable接口,该类对象既可以实现复制--浅复制,但基于浅复制深复制的概念,有可能会对复制结果造成预期外的结果:因为类中可能会有引用类型,这种情况下对其的复制只是引用(浅复制),之后对副本的个性化修改实际是修改了原对象!

    举例如下:

    简历中会涉及工作经历,工作经历大致有年限、公司信息,把这个工作经历提取成单独的类,而简历只是维护了对这个工作经历的引用,这时对简历的复制,工作经历部分就只是复制了引用,之后如果修改工作经历的内容,实际是修改了所有简历的工作经历,因为引用是同一个,解决方案便是多层克隆:

    工作经历类:

     1 class WorkExperience : ICloneable
     2     {
     3         public string WorkDate { get; set; }
     4         public string WorkCompany { get; set; }
     5 
     6         public object Clone()
     7         {
     8             return this.MemberwiseClone();
     9         }
    10     }
    View Code

    简历类:

     1 class Resume : ICloneable
     2     {
     3         private string name;
     4         private string sex;
     5         private int age;
     6         private string timeArea;
     7         private string company;
     8 
     9         public Resume(string name)
    10         {
    11             this.name = name;
    12         }
    13 
    14         /// <summary>
    15         /// 初始化个人信息
    16         /// </summary>
    17         public void SetPersonalInfo(int age, string sex)
    18         {
    19             this.age = age;
    20             this.sex = sex;
    21         }
    22 
    23         /// <summary>
    24         /// 初始化工作经历
    25         /// </summary>
    26         public void SetWorkInfo(string timeArea, string company)
    27         {
    28             this.timeArea = timeArea;
    29             this.company = company;
    30         }
    31 
    32         /// <summary>
    33         /// 展示个人简历
    34         /// </summary>
    35         public void Display()
    36         {
    37             Console.WriteLine("{0},{1},{2},{3}工作于{4}", this.name, sex, age, timeArea, company);
    38         }
    39 
    40         /// <summary>
    41         /// 克隆(浅复制)方法
    42         /// </summary>
    43         /// <returns></returns>
    44         public object Clone()
    45         {
    46             return this.MemberwiseClone();
    47         }
    48     }
    View Code

    客户端调用:

     1 /// <summary>
     2     /// 原型模式
     3     /// </summary
     4     class Program
     5     {
     6         static void Main(string[] args)
     7         {
     8             Resume r1 = new Resume("大鸟");
     9             r1.SetPersonalInfo("", "27");
    10             r1.SetWorkExperience("2011.11~2013.12", "百度公司");
    11 
    12             Resume r2 = (Resume)r1.Clone();
    13             r2.SetWorkExperience("2013.12~2014.12", "腾讯公司");
    14 
    15             r1.Display();
    16             r2.Display();
    17 
    18             Console.Read();
    19         }
    20     }
    View Code
  • 相关阅读:
    Android中获取网络图片的三种方法
    关于android性能,内存优化
    web端调用Android端方法的过程
    [程序猿感悟] [悟] 两篇不错的文章 (转载自 stay4it )
    ListView 中使用onItemClick和onItemLongClick的常见问题
    TextView 在java中使用Html设置字体大小颜色
    Android-手机端开发用界面原型与布局工具
    Android Service完全解析,关于服务你所需知道的一切(下)
    Android Service完全解析,关于服务你所需知道的一切(上)
    (转 todo阅读)Android 官方博客
  • 原文地址:https://www.cnblogs.com/baweier2013/p/5014579.html
Copyright © 2020-2023  润新知