原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
模式角色与结构:
示例代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace CSharp.DesignPattern.PrototypePattern { class Program { static void Main(string[] args) { Prototype obj1 = new ConcretePrototypeA(); obj1.Attr = "Sunny"; Prototype obj2 = obj1.Clone(); Prototype obj3 = new ConcretePrototypeB(); obj3.Attr = "Dummy"; Prototype obj4 = obj3.Clone(); Console.ReadLine(); } } interface Prototype { Prototype Clone(); String Attr { get; set; } } class ConcretePrototypeA : Prototype { public Prototype Clone() //克隆方法 { Prototype prototype = new ConcretePrototypeA(); // 创建新对象 prototype.Attr = this.attr; // 这里是关键 return prototype; } public String Attr { get { return attr; } set { attr = value; } } private String attr; //成员属性 } class ConcretePrototypeB : Prototype { public Prototype Clone() { ConcretePrototypeB prototype = new ConcretePrototypeB(); prototype.Attr = this.attr; return prototype; } public string Attr { get { return attr; } set { attr = value; } } private String attr; } }
思考
能否将上述代码中的Clone()方法写成:public Prototype Clone() { return this; }?
浅克隆与深克隆
在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制。
在深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制。