设计模式——原型模式

目录

原型模式

克隆羊问题

  • 现在有一只羊 姓名:tom 年龄:1 颜色:白色,请编写创建和tom羊属性完全相同的羊

传统方式

羊类

java 复制代码
public class Sheep {
    private String name;
    private int age;
    private String color;

    public Sheep(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }
    @Override
    public String toString() {
        return "Sheep{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", color='" + color + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getColor() {
        return color;
    }
}

测试类 创建多个相同的羊(传统方式)

java 复制代码
public class Client {
    public static void main(String[] args) {
        // 传统方式
        Sheep sheep = new Sheep("tom", 1, "白色");
        Sheep sheep2 = new Sheep(sheep.getName(),sheep.getAge(),sheep.getColor());
        Sheep sheep3 = new Sheep(sheep.getName(),sheep.getAge(),sheep.getColor());
        Sheep sheep4 = new Sheep(sheep.getName(),sheep.getAge(),sheep.getColor());
        System.out.println(sheep);
        System.out.println(sheep2);
        System.out.println(sheep3);
        System.out.println(sheep4);
    }
}
优缺点
  • 优点是比较好理解,简单易操作
  • 在创建新的对象时,总是需要重新后获取原始对象的属性,如果创建的对象比较复杂时,效率较低
  • 总是需要重新初始化对象,而不是动态的获得对象的运行时的状态,不够灵活
    • 改进
      • Java中Object类是所有类的根类,Object类提供了一个clone()方法,该方法可以将一个Java对象复制一份,但是需要实现clone的Java类就必须要实现一个接口Cloneable,这个接口表示该类能够赋值并且具有复制的能力 ---> 原型模式

基本介绍

  • 原型模式是:用原型实例指定创建对象的种类,并且通过拷贝这些原型,创建新的对象
  • 原型模式是一种创建型设计模式,允许一个对象再创建另一个可定制的对象,无需知道如何创建的细节
  • 工作原理:通过将一个原型对象传给那个要发动创建的对象, 这个要发动创建的对象通过请求原型对象拷贝他们自己来实施创建,即 对象.clone
  • 形象的理解:孙悟空拔出猴毛,变出自己

使用原型模式优化克隆羊

java 复制代码
public class Sheep implements Cloneable {
    private String name;
    private int age;
    private String color;

    public Sheep(String name, int age, String color) {
        this.name = name;
        this.age = age;
        this.color = color;
    }

    @Override
    public String toString() {
        return "Sheep{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", color='" + color + '\'' +
                '}';
    }
    @Override
    protected Sheep clone() throws CloneNotSupportedException {
        Sheep sheep = null;
        try {
            sheep = (Sheep) super.clone();
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
        return sheep;
    }
}
java 复制代码
public class Client {
    public static void main(String[] args) throws CloneNotSupportedException {
       
        Sheep sheep = new Sheep("tom", 1, "白色");
        Sheep clone = sheep.clone();
        Sheep clone1 = sheep.clone();
        Sheep clone2 = sheep.clone();
        Sheep clone3= sheep.clone();
        System.out.println(clone);
        System.out.println(clone1);
        System.out.println(clone2);
        System.out.println(clone3);
    }
}

原型模式应用

  • Spring中原型Bean的创建,就是原型模式的应用

潜拷贝

  • 对于数据类型是基本数据类型的成员变量,浅拷贝会直接进行值传递,也就是将该属性值赋值一份给新的对象
  • 对于数据类型性是 引用数据类型 的成员变量,比如说成员变量是某个数组 某个类的对象 等,那么浅拷贝会进行引用传递,也就是只是将该成员变量的引用值(内存的地址)复制一份给新的对象,因为实际上两个对象的该成员变量都指向同一个实例。在这种情况下,在一个对象中修改该成员变量会影响到另一个对象的该成员变量值
  • 前面克隆羊就是浅拷贝
  • 浅拷贝是使用默认的clone()方法实现的【sheep = (Sheep) super.clone();

深拷贝

  • 复制对象的所有基本数据类型的成员变量值
  • 为所有引用数据类型的成员变量申请存储空间,并复制每个引用个数据类型成员变量所引用的对象,直到该对象可达的所有对象,也就是说,对象进行深拷贝要对整个对象进行拷贝
  • 深拷贝实现方式1:重写colon方法来实现深拷贝
  • 深拷贝实现方式2:通过对象序列化实现深拷贝
相关推荐
带刺的坐椅11 分钟前
Solon v3.4.7, v3.5.6, v3.6.1 发布(国产优秀应用开发框架)
java·spring·solon
四谎真好看2 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程2 小时前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t2 小时前
ZIP工具类
java·zip
lang201509282 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
pengzhuofan3 小时前
第10章 Maven
java·maven
百锦再4 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说4 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多4 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring
百锦再4 小时前
对前后端分离与前后端不分离(通常指服务端渲染)的架构进行全方位的对比分析
java·开发语言·python·架构·eclipse·php·maven