首页 > 其他分享 >设计模式之原型模式

设计模式之原型模式

时间:2023-11-25 20:34:11浏览次数:37  
标签:String clone 模式 原型 new 拷贝 设计模式 shallowPojo name

原型模式指的是,从对象copy一个对象到另一个对象

  • 浅拷贝: 类对象copy的时候使用的是地址,基础类型会进行数据拷贝
  • 深拷贝:基础数据类型以及类对象都会进行数据copy
  • spring创建对象的时候,可以选择单例,也可以选择原型模式

原始的copy方式:

需要拷贝的类

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class PrimitivePojo {

private String id;

private String name;

}

运行拷贝的类

public class Primitive {

public static void main(String[] args) {

PrimitivePojo primitivePojo = new PrimitivePojo("11", "张三");

PrimitivePojo prototypeType1 = new PrimitivePojo(primitivePojo.getId(), primitivePojo.getName());
PrimitivePojo prototypeType2 = new PrimitivePojo(primitivePojo.getId(), primitivePojo.getName());
PrimitivePojo prototypeType3 = new PrimitivePojo(primitivePojo.getId(), primitivePojo.getName());
PrimitivePojo prototypeType4 = new PrimitivePojo(primitivePojo.getId(), primitivePojo.getName());
PrimitivePojo prototypeType5 = new PrimitivePojo(primitivePojo.getId(), primitivePojo.getName());
}
}

优缺点分析:

优点:理解容易

缺点:后期增加属性的时候,需要改动代码,且增加一个必须改动拷贝类的代码,违法了opc原则

浅copy:

需要拷贝的类

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class ShallowPojo implements Cloneable {

    private String id;

    private String name;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

运行拷贝的类

public class Shallow {

    public static void main(String[] args) throws CloneNotSupportedException {
        ShallowPojo shallowPojo = new ShallowPojo("1", "张三");

        System.out.println(shallowPojo);

        ShallowPojo shallowPojo1 = (ShallowPojo) shallowPojo.clone();
        ShallowPojo shallowPojo2 = (ShallowPojo) shallowPojo.clone();
        ShallowPojo shallowPojo3 = (ShallowPojo) shallowPojo.clone();
        ShallowPojo shallowPojo4 = (ShallowPojo) shallowPojo.clone();
        ShallowPojo shallowPojo5 = (ShallowPojo) shallowPojo.clone();

        System.out.println(shallowPojo1);
        System.out.println(shallowPojo2);
        System.out.println(shallowPojo3);
        System.out.println(shallowPojo4);
        System.out.println(shallowPojo5);
    }

}

只能对基础属性以及字符串类型进行copy  

深拷贝:

测试浅拷贝的方式 雷属性的hash一致即为浅copy

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class ShallowCopyPojo implements Cloneable {

    private String id;

    private String name;

    private ShallowPojo shallowPojo;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

运行拷贝的类 

public class DeepMain {

    public static void main(String[] args) throws CloneNotSupportedException {
        // 测试浅拷贝  存在对象属性的情况下 只是引用了地址 没有进行深拷贝
        ShallowCopyPojo shallowCopyPojo = new ShallowCopyPojo("1", "张三", new ShallowPojo("2", "lisi"));
        System.out.println("id: " + shallowCopyPojo.getId() + ", name: " + shallowCopyPojo.getName() + ",shallowPojo hash:" + shallowCopyPojo.getShallowPojo().hashCode());
        ShallowCopyPojo shallowCopyPojo1 = (ShallowCopyPojo) shallowCopyPojo.clone();
        System.out.println("id: " + shallowCopyPojo1.getId() + ", name: " + shallowCopyPojo1.getName() + ",shallowPojo hash:" + shallowCopyPojo1.getShallowPojo().hashCode());
    }
}

深拷贝方式1 (不推荐使用)

@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class DeepCopyPojo1 implements Cloneable {

    private String id;

    private String name;

    private DeepCopyPojoA deepCopyPojoA;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        DeepCopyPojo1 result = (DeepCopyPojo1)super.clone();
        result.setDeepCopyPojoA((DeepCopyPojoA) result.getDeepCopyPojoA().clone());
        return result;
    }

}

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
class DeepCopyPojoA implements Cloneable {
    private String id;
    private String name;

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

运行拷贝的类

public class DeepMain {

    public static void main(String[] args) throws CloneNotSupportedException {
        // 深拷贝方式1
        DeepCopyPojo1 deepCopyPojo1 = new DeepCopyPojo1("1", "张三", new DeepCopyPojoA("2", "李四"));
        System.out.println("id: " + deepCopyPojo1.getId() + ", name: " + deepCopyPojo1.getName() + ",shallowPojo hash:" + deepCopyPojo1.getDeepCopyPojoA().hashCode());

        DeepCopyPojo1 deepCopyPojoA = (DeepCopyPojo1) deepCopyPojo1.clone();
        System.out.println("id: " + deepCopyPojoA.getId() + ", name: " + deepCopyPojoA.getName() + ",shallowPojo hash:" + deepCopyPojoA.getDeepCopyPojoA().hashCode());
    }
}

深拷贝方式2(推荐使用)

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class DeepCopyPojo2 implements Cloneable, Serializable {

    private String id;

    private String name;

    private DeepCopyPojoB deepCopyPojoB;

    public DeepCopyPojo2 deepClone() {
        ByteArrayOutputStream byteArrayOutputStream = null;
        ObjectOutputStream objectOutputStream = null;
        ByteArrayInputStream byteArrayInputStream = null;
        ObjectInputStream objectInputStream = null;

        try {
            byteArrayOutputStream = new ByteArrayOutputStream();
            objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
            objectOutputStream.writeObject(this);
            byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
            objectInputStream = new ObjectInputStream(byteArrayInputStream);
            return (DeepCopyPojo2) objectInputStream.readObject();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (Objects.nonNull(objectInputStream)) {
                    objectInputStream.close();
                }
                if (Objects.nonNull(byteArrayInputStream)) {
                    byteArrayInputStream.close();
                }
                if (Objects.nonNull(objectOutputStream)) {
                    objectOutputStream.close();
                }
                if (Objects.nonNull(byteArrayOutputStream)) {
                    byteArrayOutputStream.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
class DeepCopyPojoB implements Serializable {
    private String id;
    private String name;

}

运行拷贝的类

public class DeepMain {

    public static void main(String[] args) throws CloneNotSupportedException {
        // 测试浅拷贝  存在对象属性的情况下 只是引用了地址 没有进行深拷贝
        ShallowCopyPojo shallowCopyPojo = new ShallowCopyPojo("1", "张三", new ShallowPojo("2", "lisi"));
        System.out.println("id: " + shallowCopyPojo.getId() + ", name: " + shallowCopyPojo.getName() + ",shallowPojo hash:" + shallowCopyPojo.getShallowPojo().hashCode());
        ShallowCopyPojo shallowCopyPojo1 = (ShallowCopyPojo) shallowCopyPojo.clone();
        System.out.println("id: " + shallowCopyPojo1.getId() + ", name: " + shallowCopyPojo1.getName() + ",shallowPojo hash:" + shallowCopyPojo1.getShallowPojo().hashCode());

        // 深拷贝方式1
        DeepCopyPojo1 deepCopyPojo1 = new DeepCopyPojo1("1", "张三", new DeepCopyPojoA("2", "李四"));
        System.out.println("id: " + deepCopyPojo1.getId() + ", name: " + deepCopyPojo1.getName() + ",shallowPojo hash:" + deepCopyPojo1.getDeepCopyPojoA().hashCode());

        DeepCopyPojo1 deepCopyPojoA = (DeepCopyPojo1) deepCopyPojo1.clone();
        System.out.println("id: " + deepCopyPojoA.getId() + ", name: " + deepCopyPojoA.getName() + ",shallowPojo hash:" + deepCopyPojoA.getDeepCopyPojoA().hashCode());

        // 深拷贝方式2 推荐使用
        DeepCopyPojo2 deepCopyPojo2 = new DeepCopyPojo2("1", "张三", new DeepCopyPojoB("2", "李四"));
        System.out.println("id: " + deepCopyPojo2.getId() + ", name: " + deepCopyPojo2.getName() + ",shallowPojo hash:" + deepCopyPojo2.getDeepCopyPojoB().hashCode());

        DeepCopyPojo2 deepCopyPojoB = deepCopyPojo2.deepClone();
        System.out.println("id: " + deepCopyPojoB.getId() + ", name: " + deepCopyPojoB.getName() + ",shallowPojo hash:" + deepCopyPojoB.getDeepCopyPojoB().hashCode());

    }
}

  

标签:String,clone,模式,原型,new,拷贝,设计模式,shallowPojo,name
From: https://www.cnblogs.com/abel-he/p/17856010.html

相关文章

  • 创建型设计模式05-抽象工厂模式
    1、抽象工厂模式介绍抽象工厂模式(AbstractFactoryPattern)是一种创建型设计模式,围绕一个超级工厂创建其他工厂,也称作为工厂的工厂(大工厂里的小工厂)。在抽象工厂模式中,接口负责创建一组相关对象的工厂,而不需要显式指定它们的类。这种设计模式能够将客户端与具体的实现分离,从而使得......
  • 交换机通过boot模式升级
    配置步骤1、交换机通过Console口连接配置PC机。通过MG口连接TFTP服务器,如果交换机上没有MG口则连接设备的1口。2、在TFTPServer上运行服务端程序,配置TFTPServer的IP地址为192.168.1.1/24。将升级所需的文件放置在TFTPServer的根目录。3、在配置PC上,打开超级终端程序,启动交换......
  • 设计模式实验19:中介者模式
    实验19:中介者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解中介者模式的动机,掌握该模式的结构;2、能够利用中介者模式解决实际问题。    [实验任务一]:虚拟聊天室在“虚拟聊天室”实例中增加一个新的具体聊天室类和一个新的具体会员类,要......
  • 设计模式实验 20:备忘录模式
    本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解备忘录模式的动机,掌握该模式的结构;2、能够利用备忘录模式解决实际问题。    [实验任务一]:多次撤销改进课堂上的“用户信息操作撤销”实例,使得系统可以实现多次撤销(可以使用HashMap、ArrayList等......
  • 前端框架vue路由hash模式与history模式的区别
    hash模式会在页面初始化的时候,url后面会带上/#的hash值,后面是路由组件加携带参数,缺点是看起来不太美观,但相比于history模式来说,它具有用户在页面各种点击操作后,点击刷新后数据不丢失,也不会出现网络报错。而history模式优点是能让整个url看起来比较简洁美观,但问题就是项目部署上线......
  • 每日随笔——职责链模式
    [实验任务一]:财务审批某物资管理系统中物资采购需要分级审批,主任可以审批1万元及以下的采购单,部门经理可以审批5万元及以下的采购单,副总经理可以审批10万元及以下的采购单,总经理可以审批20万元及以下的采购单,20万元以上的采购单需要开职工大会确定。现用职责链模式设计该系统。......
  • 整合驰骋工作流引擎的三种模式以及的优缺点总结
    什么是系统集成?1.当您需要把ccbpm的系统与您的系统或开发架构要一起工作的时候,我们就称为集成.2.集成步骤:功能应用方面的集成与组织结构的集成.3.组织结构集成是第一步,ccbpm有自己独立组织结构,可以独立运行,当与您的应用一起工作时才需要集成。组织结构集成.1.组织结构集成分......
  • 前端原型和原型链构造函数的使用
    目录前言导语代码部分运行结果前言我是歌谣我有个兄弟巅峰的时候排名c站总榜19叫前端小歌谣曾经我花了三年的时间创作了他现在我要用五年的时间超越他今天又是接近兄弟的一天人生难免坎坷大不了从头再来歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语前端原型和原型......
  • 前端原型和原型链实例的学习
    目录前言导语在构造函数上定义方法运行结果在原型链上定义方法运行结果总结前言我是歌谣歌谣的意志是永恒的放弃很容易但是坚持一定很酷导语前端原型和原型链实例的学习#编辑在构造函数上定义方法```//在构造函数上直接定义方式functionAnimai(){this.eat=function(){conso......
  • 实验5:建造者模式
    实验5:建造者模式本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:1、理解建造者模式的动机,掌握该模式的结构;2、能够利用建造者模式解决实际问题。 [实验任务一]:计算机组装使用建造者模式,完成下述任务:计算机组装工厂可以将CPU、内存、硬盘、主机等硬件设备组装在一起......