• 设计模式之原型模式


    概述

    通过复制一个已存在对象来生成一个新对象,被复制的对象称为原型;

    UML

    • Prototype(原型) : 声明一个克隆自身的接口。
    • ConcretePrototype(具体的原型) :实现一个克隆自身的操作。
    • Client(场景) 让一个原型克隆自身从而创建一个新的对象。

    补充说明

    1、JAVA中Object的clone方法已经为什么提供了复制对象的实现,且该方法为本地方法,性能好,在需要大量复制对象的情况,使用clone创建对象比new效率高;

    补充下深拷贝和浅拷贝

    深拷贝是通过拷贝内存(包括引用的对象)实现对象的创建;

    浅拷贝不拷贝引用的对象,但拷贝了引用的值,如果类的成员属性中都是基本类型,不含对象,也是可以达到深拷贝的效果;深拷贝可以通过将对象序列化成字节流以及反序列化实现,浅拷贝直接调用clone即可;

    2、使用原型模式创建对象是没有调用类的构造方法的;

    示例

    java已经很好的支持原型模式了,使用很简便,如下类,实现了Cloneable接口,即成了一个原型;

    package com.dyleaf.create.PrototypePattern;
    
    public class Cell implements Cloneable {
        private int cellId;
    
        public int getCellId() {
            return cellId;
        }
    
        public void setCellId(int cellId) {
            this.cellId = cellId;
        }
    
        public Cell(int id) {
            this.cellId = id;
        }
    
        @Override
        public Object clone() throws CloneNotSupportedException {
            System.out.println("clone a cell obj.");
            return (Cell) super.clone();
        }
    }
    

    使用原型,复制10个拷贝:

    package com.dyleaf.create.PrototypePattern;
    
    public class Test {
        public static void main(String[] args) throws CloneNotSupportedException {
            Cell prototypeCell = new Cell(888);
            for(int i = 0; i < 10; i++){
                Cell copyCell = (Cell) prototypeCell.clone();
                System.out.println(copyCell.hashCode() + ":" + copyCell.getCellId());
            }
        }
    }
    
    

    观察打印结果,hashcode不同,对象成员属性一致,复制成功:

    clone a cell obj.
    356573597:888
    clone a cell obj.
    1735600054:888
    clone a cell obj.
    21685669:888
    clone a cell obj.
    2133927002:888
    clone a cell obj.
    1836019240:888
    clone a cell obj.
    325040804:888
    clone a cell obj.
    1173230247:888
    clone a cell obj.
    856419764:888
    clone a cell obj.
    621009875:888
    clone a cell obj.
    1265094477:888
    

    优缺点

    优点:

    • 性能优良。原型模式是在内存二进制流的拷贝,要比直接new一个对象性能好很多,特别是要在一个循环体内产生大量的对象时,原型模式可以更好地体现其优点。

    缺点:

    • 逃避构造函数的约束。这既是它的优点也是缺点,直接在内存中拷贝,构造函数是不会执行的。优点就是减少了约束,缺点也是减少了约束.

    see source code

  • 相关阅读:
    (48)zabbix报警媒介:自定义脚本Custom alertscripts
    Centos7下cratedb数据导入导出copy to copy from
    CentOS7下cratedb备份及恢复(快照)
    Centos7下mysql5.7.22主从配置
    Centos7安装配置MySQL5.7
    Centos7安装配置iptable
    Centos7 LNMP 一键安装
    Centos7防范SYN
    Centos7安装RabbitMQ解决Erlang依赖报错
    centos7安装配置zabbix4.0
  • 原文地址:https://www.cnblogs.com/Dyleaf/p/8507035.html
Copyright © 2020-2023  润新知