原型模式——java设计模式(六)

简介

原型模式(Prototype Pattern):使用原型实例指定待创建对象的类型,并通过复制这个原型来创建新的对象。

  • 当需要使用相同或者相似对象时,将原型类自身作为工厂,复制新的对象。

结构和实现

  • 角色包括:
    • 抽象原型类:声明克隆方法的接口,可以使抽象类、接口、具体类。java中通常为Object类。
    • 具体原型类:实现克隆方法,返回自身的克隆对象。
  • 原型模式结构。
    180506.clone.png
  • 实现的clone方法分为浅克隆深克隆,区别在于是否复制引用类型的成员变量。

浅克隆

  • 实现Cloneable接口,重写clone方法,调用父类的clone方法。
    @Override
    protected Prototype clone() throws CloneNotSupportedException {
        return (Prototype) super.clone();
    }

深克隆

  • 实现 Cloneable, Serializable 接口,重写clone方法,序列化对象之后反序列化。
    • 可以使用输入输出流,也可以使用json字符串。
    • 成员对象如果是引用类型,也需要实现Serializable接口。
    @Override
    protected Prototype clone() throws CloneNotSupportedException {
        Prototype prototype = null;
        try {
            //序列化
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(baos);
            oos.writeObject(this);

            //反序列化
            ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bais);
            prototype = (Prototype) ois.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } finally {
            //关闭流
        }
        return prototype;
    }

实例

  • 每周的周报大同小异,需要快速复制周报以供修改,包括周报中的附件。
  • 工作周报创建结构。
    180506.weeklylog.png

原型管理器

  • 将多个原型对象存储在一个集合中,需要对应对象时,克隆出对象。
    180506.manager.png

优缺点和适用范围

  • 优点:
    • 提高创建对象的效率。特别是对象创建过程较为复杂的时候。
    • 扩展性好。客户端可以针对抽象原型类编程。
    • 简化创建结构。无须工厂类,通过自身的克隆方法实现。
    • 可以保存对象状态。深克隆,可辅助实现撤回操作。
  • 缺点:
    • 克隆方法需要修改源码。改造已有的类或者修改克隆方法违背开闭原则。
    • 深克隆要求嵌套对象支持深克隆。对象的引用类型成员变量也需要支持深克隆。
  • 适用环境:
    • 创建对象成本较大,操作复杂。
    • 系统需要保存对象的状态。

jdk中的应用

  • 所有类均继承Object这一父类,浅克隆实现Cloneable接口,深克隆实现 Cloneable, Serializable 接口。
    180506.weeklylog.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值