java设计模式中原型模式怎么实现

小编给大家分享一下java设计模式中原型模式怎么实现,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

我们提供的服务有:网站设计、成都网站设计、微信公众号开发、网站优化、网站认证、凤泉ssl等。为1000多家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的凤泉网站制作公司

 

设计模式之原型模式

 

Intro 简介

原型模式,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

原型模式其实就是从一个对象再创建另外一个可定制的对象而且不需要知道任何创建的细节。

 

实现方式

实现方式大致如下:

在 c# 中可以借助 ICloneable 接口和 MemberwiseClone 方法来方便的实现原型模式,需要注意的是这个方法是浅复制,当对象内嵌套了另外一个对象的时候,尤其需要注意。

// 浅复制
public object Clone() => MemberwiseClone();
   

示例

简单的简历,所有的字段属性都是简单类型

public class SimpleResume : ICloneable
{
    private string _name;
    private string _email;

    private string _timePeriod;
    private string _company;

    public void SetPersonalInfo(string name, string email)
    {
        _name = name;
        _email = email;
    }

    public void SetWorkExperience(string company, string timePeriod)
    {
        _company = company;
        _timePeriod = timePeriod;
    }

    public void Display()
    {
        Console.WriteLine($"{_name} {_email}");
        Console.WriteLine($"工作经历:{_timePeriod} {_company}");
    }

    public object Clone() => MemberwiseClone();
}

var resume = new SimpleResume();
resume.SetPersonalInfo("小明", "xiaoming@abc.xyz");
resume.SetWorkExperience("xxx公司", "1990~2000");
resume.Display();
var resume1 = (SimpleResume)resume.Clone();
resume1.SetWorkExperience("xxx企业", "1998~1999");
resume1.Display();
var resume2 = (SimpleResume)resume.Clone();
resume2.SetPersonalInfo("xiaohong", "xiaohong@abc.xyz");
resume2.Display();
 

深复制示例,下面是一个复杂一些的简历,里面包含了一个 WorkExperience 是另外一个类型,直接浅复制的话_workExperience 仍然指向原来的引用,来看下面的示例是怎么解决这个问题的

public class WorkExperience : ICloneable
{
    public string TimePeriod { get; set; }
    public string Company { get; set; }

    public object Clone() => MemberwiseClone();
}

public class ComplexResume : ICloneable
{
    private readonly WorkExperience _workExperience;
    private string _name;
    private string _email;

    public ComplexResume() => _workExperience = new WorkExperience();

    private ComplexResume(WorkExperience workExperience) => _workExperience = (WorkExperience)workExperience.Clone();

    public void SetPersonalInfo(string name, string email)
    {
        _name = name;
        _email = email;
    }

    public void SetWorkExperience(string comapny, string timePeriod)
    {
        _workExperience.Company = comapny;
        _workExperience.TimePeriod = timePeriod;
    }

    public void Show()
    {
        Console.WriteLine($"{_name} {_email}");
        Console.WriteLine($"Work Experience: {_workExperience.Company} {_workExperience.TimePeriod}");
    }

    public object Clone() => new ComplexResume(_workExperience)
    {
        _name = _name,
        _email = _email
    };
}

#region deep copy

var complexResume = new ComplexResume();
complexResume.SetPersonalInfo("xiaoming", "xiaoming@abc.xyz");
complexResume.SetWorkExperience("xiaomingTecch", "2001~2005");
complexResume.Show();

var complexResume1 = (ComplexResume)complexResume.Clone();
complexResume1.SetPersonalInfo("xiaohong", "xiaohong@abc.xyz");
complexResume1.Show();

#endregion deep copy
   

以上是“java设计模式中原型模式怎么实现”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注创新互联行业资讯频道!


网页题目:java设计模式中原型模式怎么实现
URL链接:http://csdahua.cn/article/jgdgpj.html
扫二维码与项目经理沟通

我们在微信上24小时期待你的声音

解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流