p:用原型例項指定建立物件的種類,並且通過拷貝這些原型建立新的物件。
原形模式其實就是從乙個物件再建立另外乙個可定製的物件,而且不需要知道任何建立的細節。
在.net中,抽象類prototype是用不著的,在system命名空間中提供了icloneable介面,其中就是唯一乙個方法是clone(),只要實現這個介面就完成了原型模式了。
以下是簡歷uml圖:
}客戶端**:
resume r1 = new resume("龔輝");
r1.setpersonalinfo("男", 28);
r1.setworkexperience("2006-08", "xx科技****");
resume r2 = (resume)r1.clone();
r2.setworkexperience("2008-09", "yy軟體集團");
resume r3 = (resume)r1.clone();
r3.setpersonalinfo("女", 23);
r1.display();
r2.display();
r3.display();
總結:一般在初始化的資訊不發生變化的情況下,轉殖是最好的辦法。既隱藏了物件建立的細節,又對效能是大大的提高。
不用重新初始化物件,而是動態地獲得物件執行時的狀態。
memberwiseclone()方法是這樣,如果欄位是值型別的,則對該字段執行逐位複製,如果欄位是引用型別,則複製引用但不複製引用的物件;因此,原始物件及其複本引用同一物件。
複製引用型別(淺複製)的例子:
console.writeline("工作經歷: ", work.workdate, work.company);
}public object clone()
}
resume r1 = new resume("龔輝");
r1.setpersonalinfo("男", 28);
r1.setworkexperience("2006-08", "xx科技****");
resume r2 = (resume)r1.clone();
r2.setworkexperience("2008-09", "yy軟體集團");
resume r3 = (resume)r1.clone();
r3.setworkexperience("2010-05", "zz計算機公司");
r1.display();
r2.display();
r3.display();
執行結果是:
r1,r2,r3三個引用都是最後一次設定,三個引用都是指向同乙個物件。這個就是「淺複製」,被複製的物件的所有變數都含有與原來的物件相同的值,而所有對其它物件的引用都仍然指向原來的物件。
深複製:把引用物件的變數指向複製過的新物件,而不是原有的被引用的物件。
深複製的例子:
console.writeline("工作經歷: ", work.workdate, work.company);
}public object clone()
}
resume r1 = new resume("龔輝");
r1.setpersonalinfo("男", 28);
r1.setworkexperience("2006-08", "xx科技****");
resume r2 = (resume)r1.clone();
r2.setworkexperience("2008-09", "yy軟體集團");
resume r3 = (resume)r1.clone();
r3.setworkexperience("2010-05", "zz計算機公司");
r1.display();
r2.display();
r3.display();
執行結果:
大話設計模式九 原型模式(簡歷影印)
淺複製 被複製物件的所有變數都含有與原來的物件相同的值,而所有的其它物件的引用都仍然指向原來的物件。工作經歷類 public class workexperience public void setworkdate string workdate public string getcompany p...
大話設計模式 第09章 簡歷影印 原型模式
第09章簡歷影印 原型模式 9.2 簡歷 初步實現 簡歷 class resume 設定個人資訊 public void setpersonalinfo string string age 設定工作經歷 public void setworkexperience string timearea,st...
設計模式 原型模式(C ) 簡歷影印
原型模式就是讓物件擁有自我拷貝的功能,方便備份物件資料或者建立物件時設定過多的引數。include include using namespace std class prototype class resume public prototype virtual void setpersonalin...