原型模式(Prototype)

简介: 原型模式的结构原型模式包含以下3个角色:•Prototype(抽象原型类)•ConcretePrototype(具体原型类)•Client(客户类)浅克隆与深克隆浅克隆(Shallow Clone):当原型对象被复制时,只复制它本身和其中包...

原型模式的结构
原型模式包含以下3个角色:
•Prototype(抽象原型类)
•ConcretePrototype(具体原型类)
•Client(客户类)

浅克隆与深克隆
浅克隆(Shallow Clone):当原型对象被复制时,只复制它本身和其中包含的值类型的成员变量,而引用类型的成员变量并没有复制
深克隆(Deep Clone):除了对象本身被复制外,对象所包含的所有成员变量也将被复制

原型核心代码

    /// <summary>
    /// 班级
    /// </summary>
    [Serializable]
    public class Class
    {
        public int Num { get; set; }
        public string Remark { get; set; }
    }

    [Serializable]
    public class StudentPrototype
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public Class Class { get; set; }

        private StudentPrototype() { }

        private static readonly StudentPrototype _studentPrototype = null;

        static StudentPrototype()
        {
            _studentPrototype = new StudentPrototype()
            {
                Id = 0,
                Name = "复制",
                Class = new Class()
                {
                    Num = 100,
                    Remark = "100"
                }
            };
        }
        public static StudentPrototype CreateInstanceClone()
        {
            StudentPrototype studentPrototype = (StudentPrototype)_studentPrototype.MemberwiseClone();
            //这样就是深clone,如果没有这段,Class实例就是浅克隆
            studentPrototype.Class = new Class()
            {
                Num = 1,
                Remark = "软谋高级班"
            };

            return studentPrototype;
        }

        public static StudentPrototype CreateInstanceSerialize()
        {
            //序列化方式创建克隆,需要保证被克隆的对象具有 serialize 特性标签
            return SerializeHelper.DeepClone<StudentPrototype>(_studentPrototype);
        }
    }  

原型模式的理解
原型模式在我的理解中时基于单例模式的一个扩展,在保证实例对象唯一的情况下,能快递new出不同的新实例
对外提供一个接口 CreateCloneInstance创建克隆对象

浅层次克隆

                Console.WriteLine("*****浅层次克隆Start**********");
                var box1 = StudentPrototype.CreateInstanceClone();
                Console.WriteLine($"Id={box1.Id} name={box1.Name}");
                var box2 = StudentPrototype.CreateInstanceClone();
                box2.Id = 10;
                box2.Name = "测试";
                Console.WriteLine($"Id={box2.Id} name={box2.Name}");
                Console.WriteLine("*****浅层次克隆End**********");

深层次克隆1 失败+成功方法

            {
                //对值类型的克隆修改值,不会影响克隆出的新对象的内容。但是引用类型的克隆有需要注意的点,Class是引用类型的值,具有Num和Remark俩个属性。如果使用下面的写法 box1.Class.Num=***,实际上源对象Class地址和克隆对象地址相同,修改一个相当于全部修改了,并没有实现我们想要的克隆效果
                Console.WriteLine("*****深层次克隆 Start**********");
                var box1 = StudentPrototype.CreateInstanceClone();
                box1.Class.Num = 10;
                box1.Class.Remark = "备注";
                Console.WriteLine($"Id={box1.Id} name={box1.Name} ClassNum={box1.Class.Num } Remark={box1.Class.Remark }");
                var box2 = StudentPrototype.CreateInstanceClone();
                box2.Id = 10;
                box2.Name = "测试";
                Console.WriteLine($"Id={box2.Id} name={box2.Name} ClassNum={box2.Class.Num } Remark={box2.Class.Remark }");
                Console.WriteLine("*****深层次克隆 End**********");
            }

深层次克隆2 序列化

   {
                //使用序列化的方式进行克隆原理,因为深层次克隆的主要问题是引用类型克隆时还是相同地址
                //我们先将初始对象序列化,在将得到的值进行反序列化,这样便能保证生成的对象存在不同的地址引用
                Console.WriteLine("*****深层次克隆2 序列化Start**********");
                var box1 = StudentPrototype.CreateInstanceSerialize();
                box1.Class.Num = 10;
                box1.Class.Remark = "备注";
                Console.WriteLine($"Id={box1.Id} name={box1.Name} ClassNum={box1.Class.Num } Remark={box1.Class.Remark }");
                var box2 = StudentPrototype.CreateInstanceSerialize();
                box2.Id = 10;
                box2.Name = "测试";
                Console.WriteLine($"Id={box2.Id} name={box2.Name} ClassNum={box2.Class.Num } Remark={box2.Class.Remark }");
                Console.WriteLine("*****深层次克隆2  序列化End**********");
            }
目录
相关文章
|
4月前
|
JavaScript 前端开发 开发者
什么是原型对象
【8月更文挑战第14天】什么是原型对象
88 0
|
7月前
|
JavaScript 前端开发
prototype(原型对象)
原型对象(prototype)是 JavaScript 中一种特殊的对象,它用于实现对象之间的属性和方法共享。在 JavaScript 中,所有的对象都有一个原型(除了全局对象,如 Math、Date 等),当我们试图访问一个对象的属性或方法时,如果该对象本身没有这个属性或方法,Jav
32 1
|
安全 Java
创建型模式 - 原型模式(Prototype Pattern)
创建型模式 - 原型模式(Prototype Pattern)
|
设计模式 缓存 Java
《一天一个设计模式》------原型模式(Prototype)
《一天一个设计模式》------原型模式(Prototype)
109 0
《一天一个设计模式》------原型模式(Prototype)
|
设计模式 Java
设计模式-Prototype原型模式
设计模式-Prototype原型模式
设计模式-Prototype原型模式
|
JavaScript 前端开发
深入理解原型对象和原型链
原型对象和原型链在前端的工作中虽然不怎么显式的使用到,但是也会隐式的使用了,比如使用的jquery,vue等啦。在进入正题的时候,我们还是需要明白什么是__proto__,prototype等知识点,主要讲解构造函数,这篇博文大多是问答形式进行...
深入理解原型对象和原型链
|
设计模式 fastjson Java
创建型-Prototype
1. 什么是原型模式? 如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象(原型)进行复制(或者叫拷贝)的方式,来创建新对象,以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式,简称原型模式。
110 0
|
设计模式 Java
浅谈JAVA设计模式之——原型模式(Prototype)
用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
184 0
浅谈JAVA设计模式之——原型模式(Prototype)
|
设计模式 Java 编译器
JAVA设计模式(05):创建型-原型模式(Prototype)
转自:http://blog.csdn.net/lovesomnus/article/details/23755505
158 0
JAVA设计模式(05):创建型-原型模式(Prototype)