栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java设计模式之原型模式

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java设计模式之原型模式

Java设计模式之原型模式

文章目录
  • Java设计模式之原型模式
  • 前言
  • 一、原型模式
  • 二、适用场景
  • 三、使用
    • 1. 浅克隆
      • 地址类
      • 用户类
      • 测试
    • 2. 深克隆
      • 地址类
      • 用户类
      • 测试
    • 3. 区别
  • 总结
    • 优点
    • 缺点


前言
  1. 掌握原型模式的应用场景
  2. 掌握原型模式浅克隆和深克隆的写法
  3. 了解克隆是如何破环单例的
  4. 了解原型模式的优、缺点

一、原型模式
  • 原型模式(Prototype Pattern)是指原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。
  • 调用者不需要知道任何创建细节,不调用构造函数。
二、适用场景
  • 类初始化消耗资源较多。
  • new产生的一个对象需要非常繁琐的过程(数据准备、访问权限等)。
  • 构造函数比较复杂。
  • 循环体中生产大量对象时。
三、使用 1. 浅克隆


地址类
@Data
@Accessors(chain = true)
public class Address {
    private String province;

    private String municipality;

    private String region;

}
用户类
@Data
public class User implements Cloneable {
    private String userName;

    private Address address;

    @Override
    protected User clone() {
        try {
            return (User) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return null;
    }
}
测试
public static void main(String[] args) {
    User user1 = new User();
    user1.setUserName("张三");
    user1.setAddress(new Address().setProvince("甘肃省").setMunicipality("兰州市").setRegion("七里河区"));
    User clone = user1.clone();
    System.out.println(user1);
    System.out.println(clone);
    System.out.println(user1 == clone); // false
    System.out.println(user1.getAddress() == clone.getAddress()); // true  引用的同一个对象,修改其中一个用户的地址会影响到另一个用户的地址
}
2. 深克隆


地址类
@Data
@Accessors(chain = true)
public class Address implements Serializable {
    private String province;

    private String municipality;

    private String region;

}
用户类
@Data
public class User implements Cloneable, Serializable {
    private String userName;

    private Address address;

    @Override
    protected User clone() {
        try {
            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            ObjectOutputStream oos = new ObjectOutputStream(bos);
            oos.writeObject(this);
            ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
            ObjectInputStream ois = new ObjectInputStream(bis);
            return (User) ois.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
}
测试
public static void main(String[] args) {
    User user1 = new User();
    user1.setUserName("张三");
    user1.setAddress(new Address().setProvince("甘肃省").setMunicipality("兰州市").setRegion("七里河区"));
    User clone = user1.clone();
    System.out.println(user1);
    System.out.println(clone);
    System.out.println(user1 == clone);
    System.out.println(user1.getAddress() == clone.getAddress());
}
3. 区别
  • 数据拷贝后两者之间是否有关联。
  • 改变一个值是否会影响到另一个数值变化。

总结 优点
  • 性能优良,Java自带原型模式是基于内存二进制流的拷贝,比直接new一个对象性能上提升了许多。
  • 可以使用深克隆方式保存对象的状态,使用原型模式将对象复制一份并将其状态保存起来,简化了创建过程。
缺点
  • 必须配备克隆(或者可拷贝)方法
  • 当对已有类进行改造的时候,需要修改代码,违反了开闭原则。
  • 深拷贝、浅拷贝需要运用得当。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/841336.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号