前言
我们在软件学习的时候接触到最多的是复用,不仅能节省大量的人力物力,还能减少系统的复杂程度。在实现软件功能的过程中,当创建多个
复杂类的实例,要是非得用NEW操作符去实现这样的类实力,但是在一定程度上增加了创建类的复杂程度而且会占用大量的内存,很多这样的类实例
对象不断增加,系统的复杂度将变得很高,因此需要寻找合适的模式来解决这个问题。每个实例是相同的,当我们需要多个相同的类实例,就没必
要一次次的用new去创建这些相同的类实例对象。最先想到的就是能服用哪些就好了,我们只创建一个类实例对象,如果后面有需要的话,可以通过
对原来对象拷贝一份来完成创建,这样在内存中不需要创建多个相同的类实例,从而减少内存的消耗和达到类实例的复用。 然而这个思路正是原型
模式的实现方式。下面就具体介绍下设计模式中的原型设计模式。
原型模式:
1 创建型模式中一个比较特殊的模式-原型模式,这个模式呢,有个最大的特点是克隆一个现有的对象,这个克隆的结果有2种,一种是是浅复
制,另一种是深复制,这里我们也会探讨下深复制和浅复制的原理,这样可能更方便大家理解这个原型模式的使用。我们都知道,创建型模式一般
是用来创建一个新的对象,然后我们使用这个对象完成一些对象的操作,我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作
就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象。
2原型模式(Prototype):用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
3结构图:原型模式其实就是从一个队形在创建另一个可定制的对象,而且不需知道任何创建的细节。
4代码部分
简历的基本实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 原型1
{
class Resume//
{
private string name;
private string sex;
private string age;
private string timeArea;
private string company;
public Resume(string name)
{
this.name=name;
}
//设置个人信息
public void SetPersonalInfo(string sex,string age)
{
this.sex = sex;
this.age = age;
}
//设置工作经验
public void SetWorkExperience(string timeArea, string company)
{
this.timeArea = timeArea;
this.company = company;
}
//显示
public void Display()
{
Console.WriteLine("{0} {1} {2}", name, sex, age);
Console.WriteLine("工作经验:{0} {1}", timeArea, company);
}
static void Main(string[] args)
{
Resume a = new Resume("大鸟");
a .SetPersonalInfo ("男","29");
a.SetWorkExperience("1998-2000", "XX公司");
Resume b = new Resume("大鸟");
b.SetPersonalInfo("男", "29");
b.SetWorkExperience("1998-2000", "XX公司");
Resume c = new Resume("大鸟");
c.SetPersonalInfo("男", "29");
c.SetWorkExperience("1998-2000", "XX公司");
a.Display();
b.Display();
c.Display();
Console.Read();
}
}
}
浅复制和深复制:
深复制-不管是值类型的成员还是引用类型的成员,这样的对象和对象副本,对任何一个成员属性的修改,都不会影响到改变对象的值。
浅复制-对象和对象副本共用同一个引用对象,那么不管是在对象还是对象副本中修改了相应的引用成员了之后,那么这个引用类型的成员就会发生变化。
class WorkExperience//工作检验类
{
private string workDate;
public string WorkDate
{
get{return workDate ;}
set{workDate =value ;}
}
private string company;
public string Company
{
get {return company;}
set {company=value ;}
}
class Resume:ICloneable
{
private string name;
private string sex;
private string age;
private WorkExperience work;
public Resume(string name)
{
this.name = name;
work=new WorkExperience ();
}
//设置和人信息
public void SetPersonalInfo(string sex,string age)
{
this.sex = sex;
this.age = age;
}
//设置工作经验
public void SetWorkExperience(string workDate, string company)
{
work.workDate = workDate;
work.company = company;
}
//显示
public void Display()
{
Console.WriteLine("{0} {1} {2}", name, sex, age);
Console.WriteLine("工作经验:{0}{1}", work.workDate, work.company);
}
public Object Clone()
{
return (object)this.MemberwiseClone();
}
总结:
它与工厂方法模式的实现非常相似,其中原型模式中的Clone方法就类似工厂方法模式中的工厂方法,只是工厂方法模式的工厂方法是通过new运算符重新创建一个新的对象(相当于原型模式的深拷贝实现),而原型模式是通过调用MemberwiseClone方法来对原来对象进行拷贝。