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这个接口, 实现了应该就可以实现克隆的
原型模式介绍
- 原型模式是指,用原型实例指定对象创建的种类,并且通过拷贝这些原型,创建新的对象
- 原型模式是一种创建型设计模式, 允许一个对象再创建另一个可定制的对象, 无需知道如何创建的细节
- 工作原理是: 通过将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝他们自己来实施创建 即对象.clone()
- 其实就是复印
原型模式类图
原理结果图说明
- Prototype: 原型类, 声明一个克隆自己的接口
- ConcretePrototype: 具体的原型类, 实现一个克隆自己的操作
- Client: 让一个原型对象克隆自己, 从而创建一个新的对象(属性一样)
原型模式解决克隆问题
使用原型模式改进传统方式问题, 让程序具有更高的效率和扩展性
代码
我靠, 看到代码的时候, 直接给我搞破防了, 原来我TM上面写的就是原型模式, 难不成我已经进入第五层了?
源码剖析
Spring框架中的应用
在SPring中多利Bean就是通过原型模式实现的
深拷贝与浅拷贝
深拷贝
就是对象依赖对象, 而不是基本数据类型
大概就是这样的情况
在调用拷贝方法的时候,依赖对象也应该是创建新的,引用也应该改变
- 实现方法
- 自己写
- JSON 来回转换
浅拷贝
就是我们当前实现的Cloneable接口,直接调用父类的clone方法, 如果没有重写过,那么就是浅拷贝, 只会拷贝基本类型, 引用类型是直接赋值的
- 实现方法
- 自己写
- 实现Cloneable接口
我不想过多写这个这个东西,大家知道怎么实现就行了
原型模式的注意事项和细节
- 创建新的对象比较复杂时, 可以利用原型模式简化对象的创建过程,同时也能提高效率
- 不用重复初始化对象, 而是动态的获取对象运行时状态
- 如果原始对象发生变化(增加或减少属性), 其他克隆对象的也会发生响应的变化, 无需修改代码
- 在实现深度克隆的时候可能需要比较复杂的代码
- 缺点
- 需要为每一个类配备一个克隆方法,这对全新的类来说不是很难, 但是对已有的类进行改造时,需要修改其源代码, 违背了OCP原则, 这点需要注意