您的位置:首页 > 其它

设计模式——原型模式

2015-08-16 21:24 253 查看
定义

    用原型实例指定创建对象的种类,并且通过拷贝这些创建新的对象。

好处与使用场景

        a.使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显。类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等

        b.在性能和安全上,通过new产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式。

        c.一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。

      使用原型模式的一个好处是简化对象的创建,使得创建对象就像我们在编辑文档时的复制粘贴一样简单。

      比如需要在一个循环体内创建对象,假如对象创建过程比较复杂或者循环次数很多的话,使用原型模式不但可以简化创建过程,而且可以使系统的整体性能提高很多。

原型模式结构图



例子:

.NET中在命名空间中提供了ICloneable接口,其中就是唯一的一个方法Clone(),只需要实现这个接口就可以完成原型模式。

原型类:简历

    class Resume :ICloneable

    {

        private string name;

        private string sex;

        private string age;

        private string timeArea;

        private string company;

        public Resume(string name)

        {

            this.name = name;

        }

        public void SetPersonalInfo(string sex, string age)

        {

            this.sex = sex;

            this.age = age;

        }

        //工作经历

        public void SetWorkExperience(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();

        }

    }

客户端代码:

        class Program

    {

        static void Main(string[] args)

        {

           //定义一个简历类(原型类)

            Resume a = new Resume("大鸟");

            a.SetPersonalInfo("男", "29");

            a.SetWorkExperience("1998-2000", "XX公司");

            Resume b = (Resume)a.Clone();   //克隆一个a对象

            b.SetWorkExperience("1998-2006", "YY公司");  //重写b对象方法

            Resume c = (Resume)a.Clone();    //再次克隆一个a对象

            c.SetPersonalInfo("男", "24");   //重写c对象方法

            //显示

            a.Display();

            b.Display();

            c.Display();

            Console.Read();

        }

    }

结果:



深复制与浅复制

上边举例就是浅复制,原型类中,如果包含一个对象,克隆原型类后得到的新类中也包含这个对象,而且和原型类中的包含的一个对象是一个对象,对谁修改都是修改的一个对象。

深复制就是通过一些方法把这个对象也克隆给新类中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: