比如设计一个简历类,我们初步定义好了这个类的结构,在客户端(client)调用的时候就要生成一个实例,然后调用该类中的方法。这样只处理了一个简历,如果有成百上千个简历,我们还要去简历那么多个实例么?那样。。。
当然,我们对于同一份简历可以用循环去调用(虽然不是一个好方法),也可以用一个实例去赋给其他实例,但是结果出来都是一样的,每个人的简历都是一样,是抄袭的,下面的原型模式就是告诉我们一种抄袭的方式:
.net中提供我们一个方法:MemberwiseClone()该方法用于对于类中的成员进行浅层复制(等下介绍什么是浅层复制)。
下面均为今天本人所学,看的书为《大话设计模式》,很多代码都是书上的代码,但是是我自己的理解,记一下,当做学习笔记
今天学习的是原型模式:
类图如下:
---图片没有上传 - -!
比如设计一个简历类,我们初步定义好了这个类的结构,在客户端(client)调用的时候就要生成一个实例,然后调用该类中的方法。这样只处理了一个简历,如果有成百上千个简历,我们还要去简历那么多个实例么?那样。。。当然,我们对于同一份简历可以用循环去调用(虽然不是一个好方法),也可以用一个实例去赋给其他实例,但是结果出来都是一样的,每个人的简历都是一样,是抄袭的,下面的原型模式就是告诉我们一种抄袭的方式: .net中提供我们一个方法:MemberwiseClone()该方法用于对于类中的成员进行浅层复制(等下介绍什么是浅层复制)。代码如下:
原型类
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace 简历
{
///
/// 原型类
///
abstract class Prototype
{
private string id;
public Prototype(string id)
{
this.id = id;
}
public string ID
{
get { return id; }
}
public abstract Prototype Clone();
}
}
以上为基本原型,作为复制的模板;
Code
namespace 简历
{
/// <summary>
/// 具体原形类
/// </summary>
class ConcretePrototype1:Prototype
{
public ConcretePrototype1(string id)
: base(id)
{
}
public override Prototype Clone()
{
return (Prototype)this.MemberwiseClone();
//throw new NotImplementedException();
}
}
}
以上为具体原型,实现了Clone方法。
以下是客户端代码:
ConcretePrototype1 p1 = new ConcretePrototype1("123456789");
ConcretePrototype1 c1 = (ConcretePrototype1)p1.Clone();
Console.WriteLine("Cloned:{0}", c1.ID);
以上就完成了一个类的成员clone
.net中提供了另外一个接口可以实现以上功能:ICloneableclass
Code
namespace 简历
{
/// <summary>
/// 简历代码
/// </summary>
class Resume:ICloneable
{
private string name;
private string sex;
private int age;
public Resume(string name)
{
this.name = name;
}
public void SetPersonInfo(string sex, int age)
{
this.sex = sex;
this.age = age;
}
public void Display()
{
Console.WriteLine("{0} {1} {2}", name, sex, age);
}
/// <summary>
/// 实现Clone接口
/// </summary>
/// <returns></returns>
public object Clone()
{
return (object)this.MemberwiseClone();
}
}
}
客户端就可以这样调用:
Code
Resume resume = new Resume("ggg");
resume.SetPersonInfo ("m",22);
Resume bb = (Resume )a.Clone ();
bb.SetPersonInfo ("f",23);
resume.Display();
bb.Display();
这样就可以复制多个人的简历,前提都是从一个模板中提出来的,这样是不是方便很多呢?
前面说到了潜复制,MemberwiseClone()方法是这样的,如果字段是值类型的,则对该字段执行逐位复制,如果是引用类型,则复制引用单不复制以用的对象