设计模式-原型模式

一、定义

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

二、类型

 创建型

三、适用场景

  • 资源优化,初始化类需要消耗非常多的资源,资源包括数据、硬件等。
  • 性能和安全要求场景,通过new产生一个对象需要非常繁琐的数据准备或访问权限。
  • 一个对象多个修改者的场景,一个对象提供给其他对象访问,而且各个调用者都可能修改这个对象的值是,可以考虑使用原型模式拷贝多个对象供调用者使用。

四、优点

  • 原型模式是在内存中进行二进制流的拷贝,要比new一个对象性能好很多,特别是在循环体里要创建大量的对象时。
  • 逃避构造函数的约束,直接在内存中拷贝,构造函数是不会执行的,这既是缺点又是优点,需要考虑实际应用场景。

五、缺点

  • 必须实现Cloneable接口,并重写Object类的clone()方法。
  • 克隆容易出现风险,深拷贝和浅拷贝要特别注意。

六、类图

 

七、代码实现

要实例化的类:

package com.wms.createtype.prototype;

public class Mail implements Cloneable {
    private String subject;
    private String receiver;
    private String content;

    public Mail(MailTemplate mailTemplate) {
        this.subject = mailTemplate.getSubject();
        this.content = mailTemplate.getContent();
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getReceiver() {
        return receiver;
    }

    public void setReceiver(String receiver) {
        this.receiver = receiver;
    }

    public String getContent() {
        return content;
    }

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

    public void sendEmai() {
        System.out.println("主题:" + this.subject + ",收件人:" + this.receiver + ",内容:" + this.content);
    }

    @Override
    protected Mail clone() throws CloneNotSupportedException {
        return (Mail) super.clone();
    }
}

 模板类,在这个例子中辅助作用:

package com.wms.createtype.prototype;

public class MailTemplate {
    private String subject;
    private String content;

    public MailTemplate(String subject, String content) {
        this.subject = subject;
        this.content = content;
    }

    public String getSubject() {
        return subject;
    }

    public void setSubject(String subject) {
        this.subject = subject;
    }

    public String getContent() {
        return content;
    }

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

 测试类:

package com.wms.createtype.prototype;

public class TestDesignPattern {
    public static void main(String[] args) throws CloneNotSupportedException {
        Mail mail = new Mail(new MailTemplate("this is subject", "this is content"));
        for (int i = 0; i < 10; i++) {
            Mail tempMail = mail.clone();
            tempMail.setReceiver("receiver" + i);
            tempMail.sendEmai();
        }
    }
}

 

posted @ 2019-01-02 21:15  请叫我大表哥  阅读(175)  评论(0编辑  收藏  举报