原型模式是一种创建型设计模式,它通过复制一个已经存在的实例来返回新的实例,而不是新建实例.被复制的实例就是我们所称的原型,这个原型是可定制的.
原型模式多用于创建复杂的或者耗时的实例, 因为这种情况下,复制一个已经存在的实例可以使程序运行更高效,或者创建值相等,只是命名不一样的同类数据.
原型模式中的拷贝分为"浅拷贝"和"深拷贝":
浅克隆: 对值类型的成员变量进行值的复制,对引用类型的成员变量只复制引用,不复制引用的对象.
深克隆: 对值类型的成员变量进行值的复制,对引用类型的成员变量也进行引用对象的复制.
首先来看一些原型模式的实现代码,这里先运用浅克隆来实现 ,首先建立一个类来表示班级
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 }