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();
            }
        }
  • 相关阅读:
    设计模式--策略模式
    安装PLSQLDeveloper
    oracle11g数据库安装
    tcp和udp的头部信息
    多线程之间实现通讯
    并发编程之多线程线程安全
    多线程快速入门
    帝国cms定时自动执行刷新任务插件DoTimeRepage
    华为S5700交换机初始化和配置SSH和TELNET远程登录方法
    织梦php7数据库备份无结果BUG修复方法
  • 原文地址:https://www.cnblogs.com/vic-tory/p/12147372.html
Copyright © 2011-2022 走看看