设计模式(五)——拷贝复制:原型模式

原型模式

原型模式(Prototype Pattern)是用于创建重复的对象,同时又能保证性能。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。其实所谓的原型模式本质上是在勒种预留的对对象的复制接口。对于一些初始化信息发生变化不大的情况下,可以采用Clone的方式创建对象,不用每次都是重新初始化对象。例如,一个对象需要在一个高代价的数据库操作之后被创建。我们可以缓存该对象,在下一个请求时返回它的克隆,在需要的时候更新数据库,以此来减少数据库调用。

  • 浅拷贝

在.Net中,System命名空间中提供了ICloneable接口,唯一一个方式Clone()实现该接口就可以实现原型模式public Object Clone() { return this.MemberwiseClone(); }

但是MemberwiseClone()只能实现浅拷贝:如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型,则复制引用但是不复制引用的对象,对于引用字段而言原始对象中的字段和副本中的字段使用同一对象。

  • 深拷贝

深复制把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象。
在C#中可以使用序列化和反序列化来实现深拷贝用到的命名空间

///二进制序列化
/// using System.IO;
/// using System.Runtime.Serialization.Formatters.Binary;
        public RootPrivilege DeepCopy()
        {
            object retval;
            using (MemoryStream ms = new MemoryStream())
            {
                BinaryFormatter bf = new BinaryFormatter();
                       //序列化成流
                bf.Serialize(ms, this);
                ms.Seek(0, SeekOrigin.Begin);
                        //反序列化成对象
                retval = bf.Deserialize(ms);
                ms.Close();
             }
             return (RootPrivilege)retval;

        }
///使用xml序列化
///using System.Xml.Serialization;
        public RootPrivilege DeepCopy()
        {
            object retval;
            using (MemoryStream ms = new MemoryStream())
            {
                XmlSerializer xml = new XmlSerializer(typeof(RootPrivilege));
                //序列化成流
                xml.Serialize(ms, this);
                ms.Seek(0, SeekOrigin.Begin);
                //反序列化成对象
                retval = xml.Deserialize(ms);
                ms.Close();
            }
            return (RootPrivilege)retval;

        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值