重学设计模式之 原型设计模式

81 阅读1分钟

原型设计模式

原型设计模式 :

定义

  1. 定义: 指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象
  2. 类型 创建型
  3. 不需要知道任何创建的细节,不调用构造函数

适用场景

1.类初始化消耗较多资源 2.new产生的一个对象需要非常繁琐的过程 数据准备 访问权限等 3.构造函数比较复杂 4.循环体中生产大量对象时

优点

1.简化创建过程 ​ 2.原型模式性能比直接new一个对象性能高

缺点:

1.必须配备克隆方法 2.对克隆复杂对象或对克隆出的对象进行复杂改造时,容易引入风险。 3.浅拷贝 深拷贝要运用得当

代码如下

1.0 邮件类

package com.zw.design.pattern.creational.prototype;

import lombok.Data;

@Data
public class Mail  implements Cloneable {

    private String name;
    private String emailAddress;
    private String content;

    //重写克隆方法
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }


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

2.0 发送邮件工具类

package com.zw.design.pattern.creational.prototype;

import java.text.MessageFormat;

public class MailUtil {


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

    public static  void saveOrigin(Mail mail){
        System.out.println("mail = 保存原始邮件记录 " + mail);
    }
}

3.0 测试类

package com.zw.design.pattern.creational.prototype;

public class Test {

    public static void main(String[] args) throws CloneNotSupportedException {

        Mail mail=new Mail();
        mail.setContent("初始化模板");
        System.out.println("mail = " + mail);
        for (int i = 0; i <=10 ; i++) {
            Mail mail1= (Mail) mail.clone();
            mail1.setName("zw"+i);
            mail1.setEmailAddress("zw"+i+"@itzhouwei.com");
            mail1.setContent("恭喜你 此次获得设计模式书籍一本");
            MailUtil.sendMail(mail1);
            System.out.println("mail克隆后 = " + mail1);
        }
        MailUtil.saveOrigin(mail);
    }
}

测试结果 在这里插入图片描述 代码如下

在开源框当中使用如下jdk Arraylist 当中也使用 还有HashMap 当中也有使用 mybatis当中使用如下 在这里插入图片描述