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的方法,每个实体类去继承这个抽象类,让后再新建一个管理类,每个实体类在管理类里面都有一个对象属性,那么管理类在上层就是通用的了,因为它包含了所有类的值。

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

  • 相关阅读:
    逆向笔记
    后缀名验证
    hook 虚表
    findhex
    敏捷开发模式下如何划定测试范围
    通过数据库来看互联网系统架构演变
    论技术人的总结习惯
    08.基于IDEA+Spring+Maven搭建测试项目--Maven的配置文件settings.xml
    07.基于IDEA+Spring+Maven搭建测试项目--logback.xml配置
    06.基于IDEA+Spring+Maven搭建测试项目--dubbo-consumer.xml配置
  • 原文地址:https://www.cnblogs.com/Smilodon/p/3099013.html
Copyright © 2011-2022 走看看