设计模式——原型模式

定义

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

好处与使用场景

        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();
        }
    }

结果:




深复制与浅复制

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

深复制就是通过一些方法把这个对象也克隆给新类中。





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 24
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值