zoukankan      html  css  js  c++  java
  • 设计模式——原型模式

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

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

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

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

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

     1 /// <summary>
     2 /// 定义一个Person类
     3 /// </summary>
     4 public class Person : ICloneable
     5 {
     6     private readonly string _word;
     7     /// <summary>
     8     /// 构造方法传入人要说的话
     9     /// </summary>
    10     /// <param name="word">要说的话</param>
    11     public Person(string word)
    12     {
    13         _word = word;
    14     }
    15     /// <summary>
    16     /// 姓名
    17     /// </summary>
    18     public string Name { get; set; }
    19 
    20     /// <summary>
    21     /// 年龄
    22     /// </summary>
    23     public int Age { get; set; }
    24 
    25     /// <summary>
    26     /// 说话的方法
    27     /// </summary>
    28     public void Say()
    29     {
    30         Console.WriteLine("{0},我叫{1},我{2}了", _word, Name, Age);
    31     }
    32     
    33     /// <summary>
    34     /// 浅拷贝的克隆方法
    35     /// </summary>
    36     /// <returns></returns>
    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的方法,每个实体类去继承这个抽象类,让后再新建一个管理类,每个实体类在管理类里面都有一个对象属性,那么管理类在上层就是通用的了,因为它包含了所有类的值。

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

  • 相关阅读:
    序列JSON数据和四种AJAX操作方式
    jquery.validate和jquery.form.js实现表单提交
    JQuery Validate使用总结1:
    HOWTO: Include Base64 Encoded Binary Image Data (data URI scheme) in Inline Cascading Style Sheets (CSS)(转)
    SharePoint 2007 使用4.0 .Net
    动态IP解决方案
    取MS CRM表单的URL
    从Iframe或新开的窗口访问MS CRM 2011(转)
    Toggle or Hidden MS CRM Tab
    Windows 2008下修改域用户密码
  • 原文地址:https://www.cnblogs.com/Smilodon/p/3099013.html
Copyright © 2011-2022 走看看