原型模式总结

原型模式

原型概念:原型是指将产品概念形象化的产物。是用来确认需求或不确定性的,也可用作最终产品形态的参照物。
原型模式就是仿佛是一个模板(当然这个模板是自己写的),里面的内容我们可以根据自己的需求添加。并且既然是模板,便可以多次应用。
原型模型的特点只有一个——可以多次应用,虽然模型内的内容可以改变,但是生产出来的东西形状是不变的。
就像从一个模子里烤出来的不同味道的饼干,虽然形状一样,但是味道确实不同。

原型模式中的关键方法

MemberwiseClone()
这个方法一般的用法是:this.MemberwiseClone() ,该方法的作用是创建一个副本,将作为模板的类中的非静态字段复制到这个副本中。
如果该字段是值类型(string、double、int…)则对该字段执行逐位复制(一个一个复制)。如果该字段是引用类型(类…),则复制被引用的对象(原始对象)但不复制引用的对象。因此原始对象及其副本引用同一对象。

当我们的copy一个原型的时候,如果该原型中有调用其他类的值得时候,其他类中的值将不会将被copy到新的副本中,而被copy到的值只有原型本类中的值。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在上面的第一张图中可以看到,Resume类不继承WorkExperience类,所以当用clone()方法克隆a的时候,本类中的值能被复制到MemberwiseClone()创建的副本中,而Work.WorkDate这类(引用类型值)从别的类中调用的值不能被复制到该新的副本中。
所以在克隆到新的实例之后,能更改的只有本类中的值(值类型)。
ICloneable接口
这个接口是一个简单的用于复制的接口。使用接口之后,便可以不用再父类中定义虚方法Clone()。这样方便我们应用克隆方法。

原型模式例子
第一步

父类原型:该原型是所有具体运行的共同点。像是一个模型的雏形,还未经打磨

abstract class Prototype
    {
        public Prototype(string name )
        {
            this.Name = name;
        }


        private  string name ;
        public string Name
        {
            get { return name; }
            set { name = value; }
        }


        public abstract Prototype Clone();
       
    }
第二步

具体原型:该原型继承父类原型,可以看做父类原型的一个分支,可以为多个。具体原型为有效原型,可以说是完工的模型;
在具体原型中调用MemberwiseClone (),用来克隆该原型。

class one : Prototype 
    {
        public one (string name) : base(name)
        {

        }
        public override Prototype Clone()
        {
           return (Prototype)this.MemberwiseClone ();
        }
    }
客户端代码
        one one = new one("小明");
        one a = (one)one.Clone();
        a.Name = "小刚";
        string onestr = one.Name;
        string astr = a.Name;
        Console.WriteLine ("one{0},a{1}", onestr , astr);
        Console.ReadKey();
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值