• 原型模式的学习


    原型模式

    定义:使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象

    原型模式结构图

    prototype
    Prototype
    +Clone()
    Client
    -prototype:Prototype
    -copy:Prototype
    +Operation() :copy = prototype.Clone()
    ConcretePrototypeA
    +Clone()
    ConcretePrototypeB
    +Clone()

    Prototype:抽象原型类 声明克隆方法的接口
    ConcretePrototype:具体原型类 实现克隆方法,返回一个克隆对象
    Client:让一个原型对象克隆自身,创建一个新对象

    克隆机制的分类:浅克隆与深克隆

    浅克隆:原型对象的成员变量是值类型(int、double、byte、bool、char等基本数据类型)时,将复制一份给克隆对象;原型对象的成员变量是引用类型(类、接口、数组等复杂数据类型)时,将引用对象的地址复制一份给克隆对象。原型对象与克隆对象的成员变量指向相同的内存地址

    深克隆:完全复制原型对象的值类型与引用类型

    注:C#中字符串string/String对象只用内容相同,无论创建新对象还是直接赋值,内存只有一份

    实现
    1.通用的克隆实现方法 创建的同时将相关参数传入新创建的对象

        abstract  class Prototype
        {
          public abstract Prototype Clone();
        }
        
        class ConcretePrototype : Prototype
        {
            private string attr; // 成员变量
            public string Attr
            {
                get { return attr;}
                set { attr = value; }
            }
            public override Prototype Clone()
            {
                ConcretePrototype prototype = new ConcretePrototype();
                prototype.Attr = attr;
                return prototype;
            }
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2.使用MemberwiseClone()方法与ICloneable接口

        class Member
        {
            
        }
    
        class ConcretePrototypeA
        {
            private Member member; // 成员变量
            public Member Member
            {
                get { return member; }
                set { Member = value; }
            }
            public ConcretePrototypeA Clone()
            {
                return (ConcretePrototypeA)this.MemberwiseClone(); //浅克隆
            }
        }
        
        class ConcretePrototypeB:ICloneable
        {
            private Member member; // 成员变量
            public Member Member
            {
                get { return member; }
                set { Member = value; }
            }
    
    
            public object Clone()
            {
                ConcretePrototypeB copy = (ConcretePrototypeB)this.MemberwiseClone();
                Member newMember = new Member();
                copy.Member = newMember;//实现深克隆
                return copy;
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37

    通过反射、序列化等方式来实现深克隆

    类的序列化与反序列化
    类标记为可序列化 [Serializable]

    //序列化
    FileStream fs = new FileStream("Temp.dat",FileMode.Create);
    BinaryFormatter formatter = new BinaryFormatter();
    formatter.Serialize(fs,this);
    fs.close()
    
    
    //反序列化
    FileStream fs = new FileStream("Temp.dat",FileMode.Open);
    BinaryFormatter formatter = new BinaryFormatter();
    (类名称)formatter.Deserialize(fs);
    fs.close()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    香橙派 Kunpeng Pro 上手初体验
    Transformer和DETR笔记
    自考《软件工程》总结笔记
    Java加密与解密
    期货开户加1分象征性收取
    操作系统入门 -- 进程的通信方式
    首发: ggrcs包,一个用于绘制直方图+限制立方样条+双坐标轴图的R包
    问:问卷中的多选题数据怎么整理?
    算法的复杂度分析
    jQuery 简介
  • 原文地址:https://blog.csdn.net/baidu_24565387/article/details/126878188