原型模式其實就是從一個對象再創建另外一個可定製的對象,而且不需要知道任何創建的細節。 .NET在System命名空間中提供了ICloneable介面,其中就是唯一的一個方法Clone(),這樣你就只需要實現這個介面就可以完成原型模式。(選至《大話設計模式》) MemberwiseClone()方法, ...
原型模式其實就是從一個對象再創建另外一個可定製的對象,而且不需要知道任何創建的細節。
.NET在System命名空間中提供了ICloneable介面,其中就是唯一的一個方法Clone(),這樣你就只需要實現這個介面就可以完成原型模式。(選至《大話設計模式》)
MemberwiseClone()方法,如果欄位是值類型的,則對該欄位執行逐位複製,如果是應用類型,則複製引用但不複製引用對象;因此,原始對象及其複本應用同一對象。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 原型模式 { class C:ICloneable { private string address; public string Address { get { return address; } set { address = value; } } public object Clone() { return (object)this.MemberwiseClone(); } } class A : ICloneable { private string name; private string sex; public C c = new C(); public void SexC(C Sc) { this.c = (C)Sc.Clone(); } public string Name { get { return name; } set { name = value; } } public string Sex { get { return sex; } set { sex = value; } } public A(string Sname, string Ssex) { this.name = Sname; this.sex = Ssex; } public void show() { Console.WriteLine("姓名為:{0}", name); Console.WriteLine("性別為:{0}", sex); Console.WriteLine("工作地點:{0}", c.Address); } public object Clone() { return (object)this.MemberwiseClone(); } } class Program { static void Main(string[] args) { C c = new C(); c.Address = "湖北"; A a = new A("張楊", "男"); a.SexC(c); c.Address = "深圳"; A a1 = (A)a.Clone(); a1.SexC(c); a.show(); a1.show(); Console.ReadKey(); } } }