原型模式
阿新 • • 發佈:2017-06-24
helper stream per 序列 序列號 for public sss logs
原型模式:對比單例模式差不多,區別原型模式復制了一個對象,相互不影響。單例模式只用一個對象
方法
namespace 原型模式 { /// <summary> /// 原型模式:對象直接克隆,相互不影響。 /// 單例模式:對象指向一個,一個修改另外一個也修改。 /// /// </summary> [Serializable] public class StudentProperty { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public Class classs { get; set; } private static StudentProperty _studentProperyt; static StudentProperty() { Console.WriteLine("這裏處理比較耗時的邏輯"); _studentProperyt = new StudentProperty(); _studentProperyt.classs= new Class(); } /// <summary> /// 淺拷貝克隆:類裏面有類的引用,無法克隆,還是會指向一個地址 /// </summary> /// <returns></returns> public static StudentProperty Clone() { return (StudentProperty)_studentProperyt.MemberwiseClone(); }/// <summary> /// 深拷貝克隆,將類直接序列號,完全克隆 /// </summary> /// <returns></returns> public static StudentProperty SerializeClone() { string str = SerializeHelper.Serializable(_studentProperyt); return SerializeHelper.Derializable<StudentProperty>(str); } } [Serializable] public class Class { public int Id { get; set; } public string Name { get; set; } } }
序列號幫助類
/// <summary> /// 將對象序列號和反序列化 /// </summary> 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)); } } }
主方法
class Program { static void Main(string[] args) { StudentProperty s1= StudentProperty.Clone(); s1.Id = 0; s1.Name = "張三"; s1.Age = 12; s1.classs.Name = "學習1"; StudentProperty s2 = StudentProperty.Clone(); s2.Id = 1; s2.Name = "李四"; s2.Age = 22; s2.classs.Name = "學習3"; StudentProperty s3 = StudentProperty.SerializeClone(); s3.Id = 0; s3.Name = "張三"; s3.Age = 12; s3.classs.Name = "學習1"; StudentProperty s4 = StudentProperty.SerializeClone(); s4.Id = 1; s4.Name = "李四"; s4.Age = 22; s4.classs.Name = "學習3"; Console.ReadKey(); } }
原型模式