原型设计模式

前言

这个模式我感觉对于我们大家来说真是的在熟悉不过了,不就是复制啊,在写代码的时候我有的时候就会ctrl+c,ctrl+v,复制的时候挺爽,出错的时候别哭就行,嘻嘻

(如有异同请指出)

内容

定义:用原型实例制定创建对象的种类,并且通过拷贝这些原型创建新的对象
解释:我们通过原型模式可以快速的创建一个对象而不需要提供专门的new()操作就可以快速完成对象的创建,这无疑是一种非常有效的方式,快速的创建一个新的对象,原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节。
当我们学习工厂模式和简单工厂等一些模式的时候,我们需要在开头的时候就需要new一个对象而原型设计模式突破了这种繁琐,它不用一点一点的从头开始进行(初始化新对象),直接利用结果就好(动态的获得对象运行时的状态)

例如图:
这里写图片描述
说简单点其实原型设计模式就是copy出来一个原来对象,就像孙悟空拔下一嘬猴毛,轻轻一吹就会变出好多的孙悟空来。

浅复制与深复制

Object类的clone方法只会拷贝对象中的基本的数据类型,对于数组、容器对象、引用对象等都不会拷贝,这就是浅拷贝。
浅复制其实就是传引用,当copy的时候我们copy的是地址中的内容,当地址中的内容改变,我们随之也改变

实现深拷贝:必须将原型模式中的数组、容器对象、引用对象等另行拷贝
深复制其实就是传引用,当copy的时候我们copy的是值,也就是说当地址中的值改变的时候不会影响到我们原来的值。
在代码中体现浅复制与深复制的区别,通过接口我们可以看出区别
如图
这里写图片描述

代码

深复制代理类

 //简历类
    class Resume : ICloneable
    {
        //定义姓名,性别,年龄,工作经历里面的work,引用工作经历对象
        private string name;
        private string sex;
        private string age;
        private WorkExperience work;

        //只对工作经历进行copy,在简历类实例化时间时实例化"工作经历"
        public Resume(string name)
        {
            this.name = name;
            work = new WorkExperience();
        }
        //提供Clone方法调用的私有构造函数,以便克隆工作经历的数据
        private Resume(WorkExperience work)
        {
            this.work = (WorkExperience)work.Clone();
        }
             .
             .
             .
             .
         //调用私有的构造方法,让工作经历克隆完成,然后
        public object Clone()
        {
            Resume obj = new Resume(this.work );
            obj.name = this.name;
            obj.sex = this.sex;
            obj.age = this.age;
            return obj ; 
         }
     }

        //工作经历类实现ICloneable
    class WorkExperience:ICloneable 
    {
        //定义工作时间字段
        private string workDate;
        //属性
        public string WorkDate
        {
            get { return workDate; }
            set { workDate = value; }
        }
        //定义公司
        private string company;
        //属性
        public string Company
        {
            get { return company; }
            set { company = value; }
        }
        //工作尽力类实现克隆方法
        public object Clone()
        {
            return (object)this.MemberwiseClone();
        }
    }

浅复制代码

      //简历类
    class Resume:ICloneable 
    {
        //定义姓名,性别,年龄,工作经历里面的work,引用工作经历对象
        private string name;
        private string sex;
        private string age;
        private WorkExperience work;

        //只对工作经历进行copy,在简历类实例化时间时实例化"工作经历"
        public Resume(string name)
        {
            this.name = name;
            work = new WorkExperience();
        }
        .
        .
        .
         public object Clone()
        {
            return (object)this.MemberwiseClone();
        }
    }


       //工作经历类
    class WorkExperience
    {
        //定义工作时间字段
        private string workDate;
        .
        .
        .
        .....

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王雪芬-Judy领袖

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值