原型模式

1、定义:指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象

     不需要知道任何创建的细节,不调用构造函数

     类型:创建型

2、适用场景

  类初始化消耗较多的资源

  new 产生的对象需要非常繁琐的过程(数据准备、访问权限等)

  构造函数比较复杂

  循环体中产生大量对象时

3、优点

  原型模式性能比直接 new 一个对象性能高

  简化创建过程

4、缺点

  必须配备克隆方法

  对克隆复杂对象或对克隆出的对象进行复杂改造时,容易引入风险

  深拷贝、浅拷贝要运用得当

5、实现

/**
 * @description
 * @author: hq
 * @create: 2022-08-28 14:04
 **/
public class Mail implements Cloneable {

    private String name;

    private String emailAddress;

    private String content;

    private Date birthDate;

    public Mail() {
        System.out.println("Mail Class Constructor");
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        System.out.println("clone");

        // 深克隆
//        Mail clone = (Mail) super.clone();
//        clone.birthDate = (Date) clone.birthDate.clone();
        
        return super.clone();
    }

    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;
    }

    public Date getBirthDate() {
        return birthDate;
    }

    public void setBirthDate(Date birthDate) {
        this.birthDate = birthDate;
    }

    @Override
    public String toString() {
        return "Mail{" +
                "name='" + name + '\'' +
                ", emailAddress='" + emailAddress + '\'' +
                ", content='" + content + '\'' +
                '}';
    }
}
/**
 * @description
 * @author: hq
 * @create: 2022-08-28 14:05
 **/
public class MailUtil {

    public static void sendMail(Mail mail) {
        String outputContent = "向{0}同学,邮件地址:{1},邮件内容:{2}发送邮件成功";

        System.out.println(MessageFormat.format(outputContent, mail.getName(), mail.getEmailAddress(), mail.getContent()));
    }

    public static void saveOriginMailRecord(Mail mail) {
        System.out.println("存储 OriginMail 记录,originMail:" + mail.getContent());
    }

}
/**
 * @description 原型模式有坑,对于要 clone 的对象中,实现 Cloneable ,默认是浅克隆,如果对象中有引用对象就要注意是否要深克隆
 * @author: hq
 * @create: 2022-08-28 14:09
 **/
public class Test {

    public static void main(String[] args) throws CloneNotSupportedException {
        Mail mail = new Mail();
        mail.setContent("初始化模板");

        for (int i = 0; i < 10; i++) {

            Mail clone = (Mail) mail.clone();

            clone.setName("姓名:" + i);
            clone.setEmailAddress("姓名:" + i + "@qq.com");
            clone.setContent("恭喜您,中奖了");
            MailUtil.sendMail(clone);
        }

        MailUtil.saveOriginMailRecord(mail);

    }

}

 

posted @ 2022-08-28 14:40  放手解脱  阅读(29)  评论(0)    收藏  举报