千家信息网

怎么理解Java设计模式的原型模式

发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,本篇内容主要讲解"怎么理解Java设计模式的原型模式",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么理解Java设计模式的原型模式"吧!一、前言单例模式
千家信息网最后更新 2025年02月02日怎么理解Java设计模式的原型模式

本篇内容主要讲解"怎么理解Java设计模式的原型模式",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"怎么理解Java设计模式的原型模式"吧!

    一、前言

    单例模式可以避免重复创建消耗资源的对象,但是却不得不共用对象。若是对象本身也不让随意访问修改时,怎么办?通常做法是备份到副本,其它对象操作副本,最后获取权限合并,类似git上的PR操作。

    二、什么是原型模式

    原型模式用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象。需要注意的关键字是,新的对象,类没变。.NET在System命名空间中提供了Cloneable接口,其中它提供唯一的方法Clone(),只需要实现这个接口就可以完成原型模式了。由于它直接操作内存中的二进制流,当大量操作或操作复杂对象时,性能优势将会很明显。

    三、原型模式的适用场景

    多用于创建大对象,或初始化繁琐的对象。如游戏中的背景,地图。web中的画布等等

    以下场景适用:

    一是类初始化需要消化非常多的资源,这个资源包括数据、硬件资源等;

    二是通过 new 产生一个对象需要非常繁琐的数据准备或访问权限,则可以使用原型模式;

    三是一个对象需要提供给其他对象访问,而且各个调用者可能都需要修改其值时,可以考虑使用原型模式拷贝多个对象供调用者使用。

    在实际项目中,原型模式很少单独出现,一般是和工厂方法模式一起出现,通过 clone的方法创建一个对象,然后由工厂方法提供给调用者。

    四、原型模式的实现

    以简历的复印来举例

    1.浅拷贝实现

    定义工作经历类

    /// /// 工作经历类/// public class WorkExperience{    private string _workDate;    public string WorkDate    {        get { return _workDate; }        set { _workDate = value; }    }     private string _company;    public string Company    {        get { return _company; }        set { _company = value; }    }}

    定义简历类

    /// /// 简历类/// class Resume : ICloneable{    private string name;    private string sex;    private string age;     private WorkExperience work;     public Resume(string name)    {        this.name = name;        work = new WorkExperience();    }     ///     /// 设置个人信息    ///     ///     ///     public void SetPersonalInfo(string sex, string age)    {        this.sex = sex;        this.age = age;    }     ///     /// 设置工作经历    ///     ///     ///     public void SetWorkExperience(string workDate, string company)    {        work.WorkDate = workDate;        work.Company = company;    }     ///     /// 显示    ///     public void Display()    {        Console.WriteLine("{0}{1}{2}", name, sex, age);        Console.WriteLine("工作经历:{0}{1}", work.WorkDate, work.Company);    }     public object Clone()    {        //创建当前object的浅表副本        return (object)this.MemberwiseClone();    }}

    客户端调用

    static void Main(string[] args){    Resume a = new Resume("张三");    a.SetPersonalInfo("男", "30");    a.SetWorkExperience("2010-2018", "腾讯公司");     Resume b = (Resume)a.Clone();    b.SetWorkExperience("2010-2015", "阿里公司");     Resume c = (Resume)a.Clone();    c.SetPersonalInfo("女", "18");  c.SetWorkExperience("2010-2015", "百度公司");     a.Display();    b.Display();    c.Display();     Console.Read();}

    结果

    张三 男 30
    工作经历 2010-2018 腾讯公司
    张三 男 30
    工作经历 2010-2018 腾讯公司
    张三 女 18
    工作经历 2010-2018 腾讯公司

    被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象,这就是浅复制。但是我们可能需要这样一种需求,要把复制的对象所引用的对象都复制一遍。比如刚才的例子,我希望a、b、c三个引用的对象都是不同的。复制时就一变二,二变三。此时,我们就要用的方式叫"深复制"

    2.深拷贝实现

    深复制把引用对象的变量指向复制过的新对象,而不是原来被引用的对象

    /// /// 工作经历类/// public class WorkExperience:ICloneable{    private string _workDate;    public string WorkDate    {        get { return _workDate; }        set { _workDate = value; }    }     private string _company;    public string Company    {        get { return _company; }        set { _company = value; }    }     public object Clone()    {        //创建当前object的浅表副本        return (object)this.MemberwiseClone();    }}
    /// /// 简历类/// class Resume : ICloneable{    private string name;    private string sex;    private string age;     private WorkExperience work;     public Resume(string name)    {        this.name = name;        work = new WorkExperience();    }     private Resume(WorkExperience work)    {        //提供Clone方法调用的私有构造函数,以便克隆"工作经历"数据        this.work = (WorkExperience)work.Clone();    }     ///     /// 设置个人信息    ///     ///     ///     public void SetPersonalInfo(string sex, string age)    {        this.sex = sex;        this.age = age;    }     ///     /// 设置工作经历    ///     ///     ///     public void SetWorkExperience(string workDate, string company)    {        work.WorkDate = workDate;        work.Company = company;    }     ///     /// 显示    ///     public void Display()    {        Console.WriteLine("{0}{1}{2}", name, sex, age);        Console.WriteLine("工作经历:{0}{1}", work.WorkDate, work.Company);    }     public object Clone()    {        //调用私有的构造方法,让"工作经历"克隆完成,然后再给这个简历对象的相关字段赋值,        //最终返回一个深复制的简历对象        Resume obj = new Resume(this.work);        obj.name = this.name;        obj.sex = this.sex;        obj.age = this.age;        return obj;    }}

    客户端调用代码一样

    结果

    张三 男 30
    工作经历 2010-2018 腾讯公司
    张三 男 30
    工作经历 2010-2015 阿里公司
    张三 女 18
    工作经历 2010-2015 百度公司

    由于在一些特定场合,会经常涉及深复制和浅复制,比如说,数据集对象DataSet,它就有Clone()方法和Copy()方法,Clone()方法用来复制DataSet的结构,但不复制DataSet的数据,实现了原型模式的浅复制,

    Copy()方法不但复制结构,还复制数据,其实就是实现了原型模式的深复制。

    到此,相信大家对"怎么理解Java设计模式的原型模式"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    对象 模式 原型 工作经历 工作 方法 公司 张三 数据 简历 腾讯 副本 拷贝 资源 设计模式 设计 用者 繁琐 个人 信息 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器挂英雄联盟 服务器资源管理器如何添加数据库 服务器主机一开游戏就蓝屏 伊犁软件开发市场价 无线网络技术 软题库 普陀区口碑好的软件开发服务电话 计算机网络技术需要学习英文吗 中国软件开发大会 宜章学计算机软件开发学费 t3 凭证数据库字段 百度网络安全周 对于网络安全内审的理解 宁夏app软件开发价格 组态王查询数据库数据慢 中粮集团网络安全2020年 网络技术的研发是什么意思 mysql 数据库复制 浏览器内嵌的数据库 互联网科技守望者 顺义区专业软件开发质量保障 校园网络安全保护等级 海南自贸区软件开发行情 数据库修改视图使用 网易版服务器如何防止外挂 网络安全专业最好的大学中国 十名网络安全教师 廊坊速力通网络技术有限公司 怎么样打开数据库表中的隐藏表 手机app软件开发哪家服务好 如皋软件开发公司招工信息
    0