• 设计模式-原型模式


    一、定义

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

    二、类型

     创建型

    三、适用场景

    • 资源优化,初始化类需要消耗非常多的资源,资源包括数据、硬件等。
    • 性能和安全要求场景,通过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();
            }
        }
    }

     

  • 相关阅读:
    SpringBoot学习
    Matlab立体标定mat转换成Opencv的CvMat
    由lib引发的血案(opencv找不函数问题)
    C# 使用Epplus导出Excel [4]:合并指定行
    C# 使用Epplus导出Excel [3]:合并列连续相同数据
    C# 使用Epplus导出Excel [2]:导出动态列数据
    C# 使用Epplus导出Excel [1]:导出固定列数据
    C# Excel常用控件总结
    C# IsNullOrEmpty与IsNullOrWhiteSpace
    C# 读App.config配置文件[2]: .Net Core框架
  • 原文地址:https://www.cnblogs.com/wangmingshun/p/10211306.html
Copyright © 2020-2023  润新知