zoukankan      html  css  js  c++  java
  • 设计模式之原型模式

    1、生活中的原型模型

      生活中,快速复制,十分常见,比如小时候考试的印刷机,先通过刻版,下一步,以刻版或母版为基础进行大批量印刷。这样能快速的创建一批符合要求的对象。

      变成中也十分常见,常见的有通过拷贝自身属性快速创建另一个对象。各个对象之间是相互独立的(内存空间地址不一致),

    2、浅克隆、深克隆

      浅克隆,即通过实现Cloneable标记接口(空接口),在浅克隆中,如果原型对象的成员变量是值类型,将复制一份给克隆对象;如果原型对象的成员变量是引用类型,则将引用对象的地址复制一份给克隆对象,也就是说原型对象和克隆对象的成员变量指向相同的内存地址。在Java语言中,通过覆盖Object类的clone()方法可以实现浅克隆。

      

    @Data
    public class WeeklyLog implements Cloneable {
        private String name;
        private String date;
        private String content;
        private Attachment attachment;
    
        @Override
        public WeeklyLog clone(){
                Object obj = null;
            try {
                obj = super.clone();
                return (WeeklyLog) obj;
            } catch (CloneNotSupportedException e) {
                System.out.println("不支持复制");
                return null;
            }
        }
    }

      深克隆,无论原型对象的成员变量是值类型还是引用类型,都将复制一份给克隆对象,深克隆将原型对象的所有引用对象也复制一份给克隆对象。简单来说,在深克隆中,除了对象本身被复制外,对象所包含的所有成员变量也将复制。需要克隆类以及其成员变量类均需要实现Serializable序列化接口。实际调用时,通过输入输出流进行转换,从而保证成员变量类中的引用地址不一致,这样才能保证深克隆。

    @Data
    public class DeepWeeklyLog implements Serializable  {
        private static final long serialVersionUID = 6273894595305648546L;
        private Attachment attachment;
        private String name;
        private String Date;
        private String content;
    
        public DeepWeeklyLog deepClone() throws IOException, ClassNotFoundException {
            //将对象写入流中
            ByteArrayOutputStream bao = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bao);
            oos.writeObject(this);
            //将对象从流中取出
            ByteArrayInputStream bis = new ByteArrayInputStream(bao.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);
            return (DeepWeeklyLog) ois.readObject();
        }
    }

    3、原型模型实现及其优点

    原型管理器(Prototype Manager)是将多个原型对象存储在一个集合中供客户端使用,它是一个
    专门负责克隆对象的工厂,其中定义了一个集合用于存储原型对象,如果需要某个原型对象
    的一个克隆,可以通过复制集合中对应的原型对象来获得。在原型管理器中针对抽象原型类
    进行编程,以便扩展。

    其中原型管理器可以通过单例模式来实现,如饿汉、懒汉

  • 相关阅读:
    多网卡ip选择
    微软编程一小时--微软2014实习生招募编程模拟测试感想
    .NET和JAVA的比较- 体系结构
    CentOS下JAVA WEB 环境搭建
    MySQL 8.0.23 安装配置向导
    uniapp map层级太高,样式支持度不高 使用nvue解决
    flex 伸缩盒子
    setInterval在浏览器切换时加速的问题
    软件包查找下载https://pkgs.org/
    斐波那契数列
  • 原文地址:https://www.cnblogs.com/SmilingFish/p/11494988.html
Copyright © 2011-2022 走看看