原型模式定义
代码实现
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#内存分配
- 进程堆(进程唯一)
- 线程栈(每个线程一个)
引用类型对象里面的值类型在堆里
值类型里面的引用类型在堆里(任何引用类型的值都在堆里)