前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 设计模式系列(6) —— 原型模式

Java 设计模式系列(6) —— 原型模式

作者头像
求和小熊猫
发布2021-01-06 11:18:36
2610
发布2021-01-06 11:18:36
举报

原型模式

原型模式的定义: 用原型实例创建对象的种类,并且通过复制这些原型创建新的对象

原型模式涉及的三个角色:

  • Client 角色 (客户角色): 该角色提出创建对象的请求
  • Prototype 角色 (抽象原型角色):该角色用于给出具体原型所需的接口,常由接口或抽象类担任
  • Concrete Protype 角色 (具体角色): 该角色是被复制的对象必须实现抽象原型的接口
浅拷贝与深拷贝

当拷贝对象时,拷贝的对象只包含简单的数据类型,或不可变对象时,就直接将这些字段复制到新对象中 但是如果拷贝对象中包含引用对象时,只拷贝引用对象的地址而不拷贝整个被引用的对象被称为浅拷贝,如果新开辟一块内存区域,将整个引用对象都拷贝一份,我们称之为深拷贝。

原型模式的简单示例
在这里插入图片描述
在这里插入图片描述

Client 角色

代码语言:javascript
复制
public class Client {
	public Prototype UsePrototypeColonePrototype(Prototype example) {
		Prototype pro = example.clone();
		return pro;		
	}

}

Prototype 角色

代码语言:javascript
复制
public interface Prototype extends Cloneable{

	public Prototype clone();
}

Concrete Prototype 角色

代码语言:javascript
复制
public class ConcretePrototype implements Prototype {

	@Override
	public ConcretePrototype clone() {
		ConcretePrototype prototype = null;
		try {
			prototype = (ConcretePrototype) super.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return prototype;
	}
}
浅拷贝与深拷贝在代码上有何异同

之前说过有深拷贝和浅拷贝,那么他们之间究竟在实现上有何区别。其实Object 类自带的 clone 方法便是浅拷贝。

那么我们该如何实现深拷贝呢。小伙伴注意了,我们在实现 Prototype 角色,使其继承了 Cloneable 接口,并让其子类重写其中的 clone 方法。那么我们可以在 充写的 clone 方法中实现引用方法的 clone。

代码语言:javascript
复制
public class ConcretePrototype implements Prototype {
	
	private ArrayList<String> sl = null;

	@Override
	public ConcretePrototype clone() {
		ConcretePrototype prototype = null;
		try {
			prototype = (ConcretePrototype) super.clone();
			prototype.setSl((ArrayList<String>)this.sl.clone());
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
		}
		return prototype;
	}

	public ArrayList<String> getSl() {
		return sl;
	}

	public void setSl(ArrayList<String> sl) {
		this.sl = sl;
	}
	
}

当然,除此之外我们也可以采用序列化的方式来实现深克隆。

原型模式的优点及使用场景

优点:

  • 性能优良:原型模式是直接在内存二进制流中进行复制的,要比直接 new 一个对象的性能要高,特别是在循环体内产生大量对象时。原型模式可以更好的提现其优点
  • 逃避构造函数的约束,

原型模式的使用场景:

  • 资源优化场景: 类初始化需要消耗很多资源,这个资源包括数据和硬件资源等
  • 性能和安全要求场景: 通过 new 产生一个新的对象需要非常繁琐的数据准备或访问权限,可以使用原型模式
  • 一个对象多个修改者场景: 一个对象需要给其他对象访问,各个调用对象都可能对齐进行修改是,可以考虑
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-01-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 原型模式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档