码迷,mamicode.com
首页 > 其他好文 > 详细

原型模式(浅克隆和深克隆)

时间:2017-12-15 23:36:39      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:get   instance   tun   read   turn   模式   using   space   16px   

原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的.
原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据.

原型模式中的拷贝分为"浅拷贝"和"深拷贝":
浅克隆: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.
深克隆: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.

首先来看一些原型模式的实现代码,这里先运用浅克隆来实现 ,首先建立一个类来表示班级

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Threading;
 4 using System.Threading.Tasks;
 5 
 6 namespace 设计模式之原型模式
 7 {
 8     /// <summary>
 9     /// 班级类
10     /// </summary>
11     public class Class
12     {
13         public int Num { get; set; }
14         public string Remark { get; set; }
15     }
16 
17     /// <summary>
18     /// 学生类
19     /// </summary>
20     class StudentPrototype
21     {
22         //模拟复杂的构造函数
23         private StudentPrototype()
24         {
25             Thread.Sleep(2000);
26             long lResult = 0;
27             for (int i = 0; i < 1000000000; i++)
28             {
29                 lResult += i;
30             }
31             Console.WriteLine("{0}被构造..", this.GetType().Name);
32         }
33 
34         private static StudentPrototype _StudentPrototype = null;
35 
36         static StudentPrototype()
37         {
38             _StudentPrototype = new StudentPrototype()
39             {
40                 Id = 337,
41                 Name = "学友",
42                 Class=new Class()
43                 {
44                     Num=1,
45                     Remark="BIGDong"
46                 }
47             };
48         }
49         /// <summary>
50         /// 克隆出实体类
51         /// </summary>
52         /// <returns></returns>
53         public static StudentPrototype CreatInstance()
54         {
55             //克隆一个对象(浅克隆)
56             StudentPrototype studentPrototype = (StudentPrototype)_StudentPrototype.MemberwiseClone();
57           
58             return studentPrototype;
59         }
60 
61         public int Id { get; set; }
62         public string Name { get; set; }
63         public Class Class{ get; set; }
64 
65         public void Study()
66         {
67             Console.WriteLine("{0}在学习设计模式",this.Name);
68         }
69     }
70 }

实例类可以调用MemberwiseClone函数来为该实体类克隆出一个副本,那么我们来做下测试

 1 namespace 设计模式之原型模式
 2 {
 3     class Program
 4     {
 5         static void Main(string[] args)
 6         {
 7             StudentPrototype stundet1 = StudentPrototype.CreatInstance();
 8             StudentPrototype stundet2 = StudentPrototype.CreatInstance();
 9             stundet1.Name = "华仔";
10             stundet1.Id = 2;
11             stundet1.Class.Num = 3;
12             stundet1.Class.Remark = "郭富城";
13 
14             Console.WriteLine(string.Format("stundet1.Name是{0},stundet1.Id是{1},stundet1.Class.Num是{2},stundet1.Class.Remark是{3},"
15             , stundet1.Name, stundet1.Id, stundet1.Class.Num, stundet1.Class.Remark));
16 
17             Console.WriteLine(string.Format("stundet2.Name是{0},stundet2.Id是{1},stundet2.Class.Num是{2},stundet2.Class.Remark是{3},"
18         , stundet2.Name, stundet2.Id, stundet2.Class.Num, stundet2.Class.Remark));
19 
20             Console.ReadKey();
21         }
22     }
23 }

 

原型模式(浅克隆和深克隆)

标签:get   instance   tun   read   turn   模式   using   space   16px   

原文地址:http://www.cnblogs.com/BigDong/p/8045104.html

(0)
(0)
   
举报
评论 一句话评论(0
0条  
登录后才能评论!
© 2014 mamicode.com 版权所有 京ICP备13008772号-2
迷上了代码!