/*
* 对于初始化对象,每New一次实例化一次对象都要执行一次构造函数,如果构造函数执行时间够长,那么执行多个对象初始化的效率就太低了。
* 一般在初始化的信息不发生变化的情况下,Clone是最好的办法。
* 因为这样既隐藏了创建的细节,又对性能大大的提高。
* 它相当于不用重新初始化对象,而是动态的获得对象运行时的状态。
*/
using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;
public class ClonePrototype : MonoBehaviour {
Resume a = new Resume("a");
Resume b;
Resume c;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
void OnGUI()
{
if(GUILayout.Button("******"))
{
CloneTest();
}
}
void CloneTest()
{
a.SetPersonalInfo("19", "man");
a.SetWorkExperience("2001-2005", "----campany");
b = (Resume)a.Clone();
b.ReName("b");
b.SetPersonalInfo("20", "woman");
c = (Resume)b.Clone();
c.ReName("c");
c.SetWorkExperience("2003-2008", "-*---campany");
a.Dispaly();
b.Dispaly();
c.Dispaly();
}
}
//*因为克隆太常用,所以.NET在System命名空间中提供了ICloneable接口,其中唯一一个方法就是Clone()*//
/* //这样只要实现这个接口就完成了原型模式// */
class Resume : ICloneable
{
private string name;
private string sex;
private string age;
private string timeArea;
private string campany;
public Resume(string name)
{
this.name = name;
}
public void ReName(string name)
{
this.name = name;
}
public void SetPersonalInfo(string age,string sex)
{
this.age = age;
this.sex = sex;
}
public void SetWorkExperience(string timeArea,string campany)
{
this.timeArea = timeArea;
this.campany = campany;
}
public void Dispaly() /* // 用来实现接口的方法,用来克隆对象// */
{
Debug.Log("name : " + name +" |sex : " + sex + " |age : " + age);
Debug.Log("TimeAndArea :"+timeArea +" |campany:"+campany);
}
/* //Clone方法// */
public System.Object Clone()
{
return (System.Object)this.MemberwiseClone();
/*
* MemberwiseClone()f方法,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型的,
* 则复制引用,但不复制引用的对象,因此原始对象及其副本引用同一对象。
* 注:当需要复制引用类型的数据的时候,可以在被引用类里添加一个Clone方法放到被引用的类里, 然后引用类里声明一个
* 私有的构造函数,参数为被引用类型,然后函数体里执行Clone方法调用。(俗称:深复制)
* 例:
* private A a;
* Private Resume(A a)
* {
* this.a = (A)a.Clone();
* }
*/
}
}