温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2021-11-17 14:40:48 来源:亿速云 阅读:157 作者:小新 栏目:大数据

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

 

设计模式之原型模式

 

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设计模式中原型模式怎么实现”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI