设计模式(java版)——创建型——原型模式

本文深入探讨了Java中深克隆技术的应用,通过原型模式实现邮件对象的复制,确保对象状态独立,避免修改原始对象。展示了如何在具体类中实现Cloneable接口,并覆盖clone方法以实现深克隆。

项目源码已提交github:https://github.com/ckl001/designPattem_java
在原型模式中我们可以利用过一个原型对象来指明我们所要创建对象的类型,然后通过复制这个对象的方法来获得与该对象一模一样的对象实例。
这就是原型模式的设计目的。

package com.Ljava.design.pattem.creational.prototype;

import java.util.Date;

/**
 * @Auther 20173
 * @Date 2019-4-9 10:28
 * @Des 邮箱
 **/
public class Mail implements Cloneable{

    //浅克隆
//    @Override
//    protected Object clone() throws CloneNotSupportedException {
//        System.out.println("克隆");
//        return super.clone();
//    }

    //深克隆
    @Override
    protected Object clone() throws CloneNotSupportedException {
        Mail mail = (Mail)super.clone();

        //深克隆
        mail.birthday = (Date) mail.birthday.clone();
        return mail;
    }

    private Date birthday;
    private String name;
    private String emailAddress;
    private String content;

    public Mail() {
        System.out.println("Mail的构造函数");
    }

    @Override
    public String toString() {
        return "Mail{" +
                "birthday=" + birthday +
                ", name='" + name + '\'' +
                ", emailAddress='" + emailAddress + '\'' +
                ", content='" + content + '\'' +
                '}';
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }
}

package com.Ljava.design.pattem.creational.prototype;

import java.text.MessageFormat;

/**
 * @Auther 20173
 * @Date 2019-4-9 10:33
 * @Des 邮件工具类
 **/
public class MailUtil {

    public static void sendMail(Mail mail){
        String outputContent = "向{0}同学,邮件地址:{1},邮件内容:{2},时间: {3} 发送邮件成功";
        System.out.println(MessageFormat.format(outputContent, mail.getName(),mail.getEmailAddress(), mail.getContent(), mail.getBirthday()));
    }

    public static void saveOrginmailRecord(Mail mail){
        System.out.println("保存Orginmail:" + mail.getContent());
    }
}

package com.Ljava.design.pattem.creational.prototype;

import java.util.Date;

/**
 * @Auther 20173
 * @Date 2019-4-9 10:37
 * @Des TODO
 **/
public class Test {

    public static void main(String[] args) throws CloneNotSupportedException {
        Mail mail = new Mail();
        mail.setContent("初始化邮件模板。。。");
        mail.setBirthday(new Date());
        System.out.println("初始化mail:" + mail.toString());

        Mail mail1 = (Mail) mail.clone();
        mail1.setName("name");
        mail1.setEmailAddress("name@qq.com");
        mail1.setContent("好嗨喔");
        mail.setBirthday(new Date("2019/04/02")); //深克隆,会修改原对象的值
        MailUtil.sendMail(mail1);

        System.out.println(mail1.toString());
        System.out.println("被修改后的mail:" + mail.toString());
        MailUtil.saveOrginmailRecord(mail);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值