第 9 章 原型模式

原型模式:用原型實例制定建立對象的種類,而且經過拷貝這些原型建立新的對象。性能

 

原型模式其實就是從一個對象再建立另一個可定製的對象,並且不須要知道任何建立的細節。
 
.Net在System命名空間中提供了ICloneable接口,其中就是惟一的一個方法Clone(),這樣你就只須要實現這個接口就完成原型模式了。
public class Resume : ICloneable
    {
        private string sex;
        private string age;
        private string timeArea;
        private string company;

        //設置我的信息
        public void SetPersonalInfo(string sex, string age)
        {
            this.sex = sex;
            this.age = age;
        }

        //設置工做經歷
        public void SetWorkExprience(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);
        }

        //克隆
        public Object Clone()
        {
            return (Object)this.MemberwiseClone();
        }
    }
通常在初始化的信息不發生變化的狀況下,克隆是最好的辦法,這既隱瞞了對象建立的細節,又對性能是大大的提升。
不用從新初始化對象,而是動態的得到對象運行時的狀態。
 
淺複製和深複製:
MemberwiseClone()方法是這樣,若是字段是值類型的,則對該字段執行逐位複製。若是字段是引用類型,則複製引用但不復制引用的對象;所以,原始對象及其副本引用同一個對象。
 
代碼結構變化:新建工做經驗類
public class Resume : ICloneable
    {
        private string name;
        private string sex;
        private string age;
        private WorkExperience workExperience;
        public Resume(string name)
        {
            this.name = name;
            this.workExperience = new WorkExperience();
        }

        //設置我的信息
        public void SetPersonalInfo(string sex, string age)
        {
            this.sex = sex;
            this.age = age;
        }

        //設置工做經歷
        public void SetWorkExprience(string timeArea, string company)
        {
            workExperience.WorkDate = timeArea;
            workExperience.Company = company;
        }

        //顯示
        public void Display()
        {
            Console.WriteLine("我的信息:{0} {1} {2}", name, sex, age);
            Console.WriteLine("工做經驗:{0} {1}", workExperience.WorkDate, workExperience.Company);
        }

        //克隆
        public Object Clone()
        {
            return (Object)this.MemberwiseClone();
        }
    }

    /// <summary>
    /// 工做經驗類
    /// </summary>
    class WorkExperience
    {
        public string WorkDate { get; set; }
        public string Company { get; set; }
    }

客戶端代碼:this

Resume r = new Resume("張三");
r.SetPersonalInfo("", "25");
r.SetWorkExprience("2010", "嘻嘻");
var rr = (Resume)r.Clone();
rr.SetWorkExprience("2014", "xx嘻");


 r.Display();
 rr.Display();
 Console.ReadLine();

由於 MemberwiseClone只是淺表複製,因此結果爲:spa

淺複製,被複制的對象的全部變量都含有與原來的對象相同的值,而全部的對其餘對象的引用都仍然指向原來的對象。可是咱們可能更須要這樣的一個需求,把要複製的對象所引用的對象都複製一遍。
深複製:把引用對象的變量指向複製過來的新對象,而不是原來的被引用的對象。
 
改爲深度複製:
 public class Resume : ICloneable
    {
        private string name;
        private string sex;
        private string age;
        private WorkExperience workExperience;
        public Resume(string name)
        {
            this.name = name;
            this.workExperience = new WorkExperience();
        }

        public Resume(WorkExperience workExperience)
        {
            this.workExperience = (WorkExperience)workExperience.Clone();
        }

        //設置我的信息
        public void SetPersonalInfo(string sex, string age)
        {
            this.sex = sex;
            this.age = age;
        }

        //設置工做經歷
        public void SetWorkExprience(string timeArea, string company)
        {
            workExperience.WorkDate = timeArea;
            workExperience.Company = company;
        }

        //顯示
        public void Display()
        {
            Console.WriteLine("我的信息:{0} {1} {2}", name, sex, age);
            Console.WriteLine("工做經驗:{0} {1}", workExperience.WorkDate, workExperience.Company);
        }

        //克隆
        public Object Clone()
        {
            Resume r = new Resume(this.workExperience);
            r.name = this.name;
            r.sex = this.sex;
            r.age = this.age;
            return r;
        }
    }

    /// <summary>
    /// 工做經驗類
    /// </summary>
    public class WorkExperience
    {
        public string WorkDate { get; set; }
        public string Company { get; set; }
        public Object Clone()
        {
            return (Object)this.MemberwiseClone();
        }
    }

結果:code

相關文章
相關標籤/搜索