04-03-设计模式 原型模式

克隆羊问题

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

传统方式解决

思路分析

代码

package com.dance.design.designmodel.ysms;

import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class yxms {
    public static void main(String[] args) {
        Sheep sheep = new Sheep("tom", 1, "白色");
        List<Sheep> collect = IntStream.range(0, 10).mapToObj(x -> sheep.clone()).collect(Collectors.toList());
        System.out.println(collect);
    }
}
class Sheep implements Cloneable{
    String name;
    Integer age;
    String color;

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

    @Override
    public Sheep clone() {
        try {
            return (Sheep) super.clone();
        } catch (CloneNotSupportedException e) {
            throw new AssertionError();
        }
    }
}

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

原型模式介绍

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

原型模式类图

原理结果图说明

  1. Prototype: 原型类, 声明一个克隆自己的接口
  2. ConcretePrototype: 具体的原型类, 实现一个克隆自己的操作
  3. Client: 让一个原型对象克隆自己, 从而创建一个新的对象(属性一样)

原型模式解决克隆问题

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

代码

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

源码剖析

Spring框架中的应用

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

深拷贝与浅拷贝

深拷贝

就是对象依赖对象, 而不是基本数据类型

大概就是这样的情况

在调用拷贝方法的时候,依赖对象也应该是创建新的,引用也应该改变

  • 实现方法
  • 自己写
  • JSON 来回转换

浅拷贝

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

  • 实现方法
  • 自己写
  • 实现Cloneable接口

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

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

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