• 原型模式


    原型模式

    1.基础知识:

    定义∶

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

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

    类型∶创建型


    适用场景

    类初始化消耗较多资源

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

    构造函数比较复杂

    循环体中生产大量对象时

    优点

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

    简化创建过程


    缺点

    必须配备克隆方法

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

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


    2.实战

    对象接口实现Cloneable接口重写clone()方法

    public class Mail implements Cloneable{
        private String name;
        private String emailAddress;
        private String content;
        public Mail(){
            System.out.println("Mail Class Constructor");
        }
    
        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;
        }
    
        @Override
        public String toString() {
            return "Mail{" +
                    "name='" + name + '\'' +
                    ", emailAddress='" + emailAddress + '\'' +
                    ", content='" + content + '\'' +
                    '}'+super.toString();
        }
    
        @Override
        protected Object clone() throws CloneNotSupportedException {
            System.out.println("clone mail object");
            return super.clone();
        }
    }
    
    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());
        }
    }
    
    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 mailTemp = (Mail) mail.clone();
                mailTemp.setName("姓名"+i);
                mailTemp.setEmailAddress("姓名"+i+"@imooc.com");
                mailTemp.setContent("恭喜您,此次活动中奖了");
                MailUtil.sendMail(mailTemp);
                System.out.println("克隆的mailTemp:"+mailTemp);
            }
            MailUtil.saveOriginMailRecord(mail);
        }
    }
    

    控制台输出:image-20220117204553011


    3.源码

    Object 的clone()方法

    protected native Object clone() throws CloneNotSupportedException;
    

    arraylist

    public class ArrayList<E> extends AbstractList<E>
            implements List<E>, RandomAccess, Cloneable, java.io.Serializable
     。。。。。。。。。。
                public Object clone() {
            try {
                @SuppressWarnings("unchecked")
                    ArrayList<E> v = (ArrayList<E>) super.clone();
                v.elementData = Arrays.copyOf(elementData, size);
                v.modCount = 0;
                return v;
            } catch (CloneNotSupportedException e) {
                // this shouldn't happen, since we are Cloneable
                throw new InternalError();
            }
        }
    

    hashmap

    public class HashMap<K,V>
        extends AbstractMap<K,V>
        implements Map<K,V>, Cloneable, Serializable
    {
    
    
    public Object clone() {
        HashMap<K,V> result = null;
        try {
            result = (HashMap<K,V>)super.clone();
        } catch (CloneNotSupportedException e) {
            // assert false;
        }
        if (result.table != EMPTY_TABLE) {
            result.inflateTable(Math.min(
                (int) Math.min(
                    size * Math.min(1 / loadFactor, 4.0f),
                    // we have limits...
                    HashMap.MAXIMUM_CAPACITY),
               table.length));
        }
        result.entrySet = null;
        result.modCount = 0;
        result.size = 0;
        result.init();
        result.putAllForCreate(this);
    
        return result;
    }
    
  • 相关阅读:
    [转]说说JSON和JSONP,也许你会豁然开朗,含jQuery用例
    [转]Vue-Devtools安装配置教程(献给伸手党)
    [转]vscode 插件推荐
    [转]eclipse中explorer显示方式
    [转]小D课堂
    [转]eclipse中 properties文件编码问题
    [转]windows环境下启动与停止.jar文件
    [转]Maven 国内源配置(2019/2/14)
    [转]Maven 全局配置文件settings.xml详解
    [转]IntelliJ IDEA 2019 上手
  • 原文地址:https://www.cnblogs.com/yslu/p/15815321.html
Copyright © 2020-2023  润新知