1. 程式人生 > >原型模式

原型模式

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();

        }
    }

原型模式