我是靠谱客的博主 勤奋过客,最近开发中收集的这篇文章主要介绍23种设计模式之原型模式23种设计模式之原型模式(Prototype )1. 代码实现总结,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
23种设计模式之原型模式(Prototype )
创建型设计模式
介绍
意图: 当直接创建重复对象的代价比较大时,采用原型模式(使用拷贝的方式)能够保证性能;
原型设计模式的核心思想就是创建一个对象需要付出很高的代价(例如操作很久的数据库),可以采用对象实现 cloneable 接口的方式,通过 clone 接口,来保证系统的性能。
主要解决:
避免系统内重复对象创建带来的性能损耗;
关键代码:
- 实现克隆操作,在JAVA继承Cloneable,重写clone()
优点:
- 性能提高(使用原型模式创建对象比直接new一个对象在性能上要好的多,因为Object类的clone 方法是一个本地方法,它直接操作内存中的二进制流,特别是复制大对象时,性能的差别非常明显)
- 逃避构造条件的约束
缺点:
- 配备克隆方法需要对类的功能进行通盘考虑,这对于已用的类不一定很容易,特别当一个类引用不支持串行化的简介对象,或者引用含有循环结构的时候。(在实现深克隆时需要编写较为复杂的代码,而且当对象之间存在多重的嵌套引用时,为了实现深克隆,每一层对象对应的类都必须支持深克隆比较麻烦。)
- 必须实现Cloneable接口。
使用场景:
1. 对象之间相同或相似,即只是个别的几个属性不同的时候。
- 创建对象成本较大,例如初始化时间长,占用CPU太多,或者占用网络资源太多等,需要优化资源。
- 创建一个对象需要繁琐的数据准备或访问权限等,需要提高性能或者提高安全性。
- 系统中大量使用该类对象,且各个调用者都需要给它的属性重新赋值。
注意事项:与通过对一个类进行实例化来构造新对象不同的是,原型模式是通过拷贝一个现有对象生成新对象的。浅拷贝实现 Cloneable,重写,深拷贝是通过实现 Serializable 读取二进制流。
1. 代码实现
package com.example.demo.test.designMode.prototype;
import lombok.Data;
@Data
public abstract class Shape implements Cloneable {
private String id;
private String type;
private ShapeChild shapeChild;
@Override
protected Object clone(){
Object o = null;
try {
o = super.clone();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}
}
public class ShapeChild implements Cloneable {
private String childId;
private String childType;
@Override
protected Object clone(){
Object o = null;
try {
o = super.clone();
}catch (CloneNotSupportedException e){
e.printStackTrace();
}
return o;
}
}
总结
原型模式 是一种简单的模式,实现一个接口,重写clone方法即可。对象的复制是通过调用Object类的clone方法来完成的,它直接在内存中复制数据,因此不会调用到类的构造方法,所以,单例模式与原型模式是冲突的。(使用时要特别注意、)
会发生深拷贝的有java中的8种基本类型和他们的封装类型,另外还有string,其余的都是浅拷贝(对象要实现深拷贝,需要对象类同样实现 Cloneable 接口,重写 clone 方法)。
两种克隆方式:
- 浅克隆: 被克隆的对象的所有变量都含有与原来的对象相同的值,而它所有对其他对象的引用都任然指向原来的对象。(浅克隆仅仅克隆所考虑的对象,而不克隆它所引用的对象)
- 深克隆: 被克隆对象的所有变量都含有与原来的对象相同的值,但它所有的对其他对象的引用不再是原有的,而这是指向被复制过的新对象。换言之,深复制把要复制的对象的所有引用的对象都复制了一遍,这种叫做间接复制。
最后
以上就是勤奋过客为你收集整理的23种设计模式之原型模式23种设计模式之原型模式(Prototype )1. 代码实现总结的全部内容,希望文章能够帮你解决23种设计模式之原型模式23种设计模式之原型模式(Prototype )1. 代码实现总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复