克隆羊问题

现在有一只羊Tom, 姓名: Tom 年龄: 1, 颜色为白色, 编写程序创建 和 Tom 羊属性完全相同的10只羊

传统方式解决

思路分析

image.png

代码

  1. package com.dance.design.designmodel.ysms;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4. import java.util.stream.IntStream;
  5. public class yxms {
  6. public static void main(String[] args) {
  7. Sheep sheep = new Sheep("tom", 1, "白色");
  8. List<Sheep> collect = IntStream.range(0, 10).mapToObj(x -> sheep.clone()).collect(Collectors.toList());
  9. System.out.println(collect);
  10. }
  11. }
  12. class Sheep implements Cloneable{
  13. String name;
  14. Integer age;
  15. String color;
  16. public Sheep(String name, Integer age, String color) {
  17. this.name = name;
  18. this.age = age;
  19. this.color = color;
  20. }
  21. @Override
  22. public Sheep clone() {
  23. try {
  24. return (Sheep) super.clone();
  25. } catch (CloneNotSupportedException e) {
  26. throw new AssertionError();
  27. }
  28. }
  29. }

额, 我并没有像视频中那样写, 我知道JDK中有Cloneable这个接口, 实现了应该就可以实现克隆的

原型模式介绍

  1. 原型模式是指,用原型实例指定对象创建的种类,并且通过拷贝这些原型,创建新的对象
  2. 原型模式是一种创建型设计模式, 允许一个对象再创建另一个可定制的对象, 无需知道如何创建的细节
  3. 工作原理是: 通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝他们自己来实施创建 即对象.clone()
  4. 其实就是复印

    原型模式类图

    image.png

    原理结果图说明

  5. Prototype: 原型类, 声明一个克隆自己的接口

  6. ConcretePrototype: 具体的原型类, 实现一个克隆自己的操作
  7. Client: 让一个原型对象克隆自己, 从而创建一个新的对象(属性一样)

    原型模式解决克隆问题

    使用原型模式改进传统方式问题, 让程序具有更高的效率和扩展性

    代码

    我靠, 看到代码的时候, 直接给我搞破防了, 原来我TM上面写的就是原型模式, 难不成我已经进入第五层了?

    源码剖析

    Spring框架中的应用

    image.png
    在SPring中多利Bean就是通过原型模式实现的

    深拷贝与浅拷贝

    深拷贝

    就是对象依赖对象, 而不是基本数据类型
    image.png
    大概就是这样的情况
    在调用拷贝方法的时候,依赖对象也应该是创建新的,引用也应该改变
  • 实现方法
  • 自己写
  • JSON 来回转换

    浅拷贝

    就是我们当前实现的Cloneable接口,直接调用父类的clone方法, 如果没有重写过,那么就是浅拷贝, 只会拷贝基本类型, 引用类型是直接赋值的

  • 实现方法

  • 自己写
  • 实现Cloneable接口

我不想过多写这个这个东西,大家知道怎么实现就行了

原型模式的注意事项和细节

  1. 创建新的对象比较复杂时, 可以利用原型模式简化对象的创建过程,同时也能提高效率
  2. 不用重复初始化对象, 而是动态的获取对象运行时状态
  3. 如果原始对象发生变化(增加或减少属性), 其他克隆对象的也会发生响应的变化, 无需修改代码
  4. 在实现深度克隆的时候可能需要比较复杂的代码
  5. 缺点
    1. 需要为每一个类配备一个克隆方法,这对全新的类来说不是很难, 但是对已有的类进行改造时,需要修改其源代码, 违背了OCP原则, 这点需要注意