zoukankan      html  css  js  c++  java
  • 设计模式系列:原型模式(Prototype Pattern)

    1.介绍

    原型模式是一种创建型设计模式,Prototype模式允许一个对象再创建另外一个可定制的对象,

    根本无需知道任何如何创建的细节,工作原理是:通过将一个原型对象传给那个要发动创建的对象,

    这个要发动创建的对象通过请求原型对象拷贝它们自己来实施创建。  

    2.示例

        [Serializable]
        public class StudentProperty
        {
            private StudentProperty()//让我们创建对象的时候,麻烦一点
            {
                long lRsult = 0;
                for (int i = 0; i < 1000000000; i++)
                {
                    lRsult += i;
                }
                Console.WriteLine("构造函数计算完成 {0}", lRsult);
            }
            private static StudentProperty _StudentProperty = null;
    
            static StudentProperty()
            {
                _StudentProperty = new StudentProperty();
                _StudentProperty.Name = "tumi";
                _StudentProperty.Class = new Advanced()
                {
                    Id = 1,
                    Name = "Advanced"
                };
            }
    
            /// <summary>
            /// 原型模式:解决对象重复创建的问题
            /// 通过MemberwiseClone来clone新对象,内存操作,直接复制的,避免重复创建
            /// </summary>
            /// <returns></returns>
            public static StudentProperty Clone()
            {
                StudentProperty studentCopy = (StudentProperty)_StudentProperty.MemberwiseClone();
                return studentCopy;
            }
    
            public int Id { get; set; }
            public string Name { get; set; }
            public DateTime Now { get; set; }
            public Advanced Class { get; set; }
    
    
        }
    
        [Serializable]
        public class Advanced
        {
            public int Id { get; set; }
            public string Name { get; set; }
    
        }
        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));
            }
        }
        /// <summary>
        /// 1 原型模式
        /// 2 浅表复制和深表复制
        /// </summary>
        class Program
        {
            static void Main(string[] args)
            {
     
                StudentProperty studentProperty1 = StudentProperty.Clone();
                studentProperty1.Name = "One";
                studentProperty1.Id = 1;
                studentProperty1.Now = DateTime.Now;
    
    
                StudentProperty studentProperty2 = StudentProperty.Clone();
                studentProperty2.Name = "Two";
                studentProperty2.Id = 2;
                studentProperty2.Now = DateTime.Now.AddDays(1);
    
    
                studentProperty2.Class.Name = "ClassName";
    
    
                StudentProperty studentProperty3 = SerializeHelper.Derializable<StudentProperty>(SerializeHelper.Serializable(studentProperty2));//借助序列化,实现深克隆
                studentProperty3.Class.Name = "ClassName";
    
                Console.Read();
            }
        }
  • 相关阅读:
    C#操作REDIS例子
    A C# Framework for Interprocess Synchronization and Communication
    UTF8 GBK UTF8 GB2312 之间的区别和关系
    开源项目选型问题
    Mysql命令大全——入门经典
    RAM, SDRAM ,ROM, NAND FLASH, NOR FLASH 详解(引用)
    zabbix邮件报警通过脚本来发送邮件
    centos启动提示unexpected inconsistency RUN fsck MANUALLY
    rm 或者ls 报Argument list too long
    初遇Citymaker (六)
  • 原文地址:https://www.cnblogs.com/vic-tory/p/12147372.html
Copyright © 2011-2022 走看看