设计模式之原型模式(Prototype)

原型模式定义

在这里插入图片描述
在这里插入图片描述

代码实现

MemberwiseClone:内存拷贝,不走构造函数,直接内存copy,所以没有性能损失;而且产生的是新对象----浅拷贝–只拷贝引用

深拷贝:

  • 直接new
  • 子类型提供原型方式 --每一个类型都提供好深拷贝函数
  • 序列化和反序列化–类型要加Serializable特性
        public static StudentPrototype CreateInstance()
        {
            StudentPrototype student = (StudentPrototype)_Student.MemberwiseClone();
            //MemberwiseClone:内存拷贝,不走构造函数,直接内存copy,所以没有性能损失;而且产生的是新对象----浅拷贝--只拷贝引用
            student.Class = new Class()
            {
                ClassId = student.Class.ClassId,
                ClassName = student.Class.ClassName
            };
            //把引用的地址重新赋值,完成了深copy--不仅拷贝引用,还得拷贝引用类型的值
            return student;
        }
        public static StudentPrototype CreateInstanceSerialize()
        {
            return SerializeHelper.DeepClone<StudentPrototype>(_Student);
        }

	//序列化帮助类
    public class SerializeHelper
    {
        public static string Serializable(object target)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                new BinaryFormatter().Serialize(stream, target);

                return Convert.ToBase64String(stream.ToArray());
            }
        }
        public static T Derializable<T>(string target)
        {
            byte[] targetArray = Convert.FromBase64String(target);

            using (MemoryStream stream = new MemoryStream(targetArray))
            {
                return (T)(new BinaryFormatter().Deserialize(stream));
            }
        }
        public static T DeepClone<T>(T t)
        {
            return Derializable<T>(Serializable(t));
        }
    }

要点总结

在这里插入图片描述
C++主要通过类对象的拷贝构造来实现,而C#、Java没有拷贝构造函数,可以考虑使用序列化和反序列化来实现。
什么时候使用原型模式还是工厂方法模式,主要考虑你在创建这个对象时是需要简单的几个步骤还是需要很复杂的中间状态,如何需要很复杂的中间状态,就是要原型模式,这样只需创建一次,后面拷贝构造就可以,否则就采用工厂方法模式。

C#内存分配

  • 进程堆(进程唯一)
  • 线程栈(每个线程一个)

引用类型对象里面的值类型在堆里
值类型里面的引用类型在堆里(任何引用类型的值都在堆里)
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值