原型模式(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; }?

浅克隆与深克隆
浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。简单来说,在浅克隆中,当对象被复制时只复制它本身和其中包含的值类型的成员变量,而引用类型的成员对象并没有复制
深克隆中,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制

 

posted on 2012-11-28 17:54  逝者如斯(乎)  阅读(608)  评论(0编辑  收藏  举报