设计模式-原型(Prototype)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了设计模式-原型(Prototype)相关的知识,希望对你有一定的参考价值。
2018-1-12 by Atlas
- UML
- 原型模式的核心就是复制,表现到java语言就是实现Cloneable,实现clone方法,具体一点,就是clone操作时以原型为模版,分配原型同样大小的内存空间,然后创建一个跟原型一样的对象实例。
- 成员count、shallowCopy的目的是说明clone操作的“浅拷贝”,不是原型模式的必要元素。
- 私有化Prototype目的是模拟不通过new语法创建对象实例,测试时尽量通过原型复制对象实例,不是原型模式的必要元素。
- 应用场景
(1)种类过多无法整合成类时。
(2)不容易利用类产生对象实例时。
(3)希望把框架和所产生的对象实例分开时。
- 简单示例
public class Prototype implements Cloneable {
private int count;
private ShallowCopy shallowCopy;
private static Prototype prototype = new Prototype(0, new ShallowCopy());
private Prototype(int count, ShallowCopy shallowCopy){
this.count = count;
this.shallowCopy = shallowCopy;
}
public Prototype clone() throws CloneNotSupportedException {
Prototype prototype = (Prototype) super.clone();
// prototype.shallowCopy = this.shallowCopy.clone();
return prototype;
}
public static void main(String[] args) throws CloneNotSupportedException {
Prototype p0 = Prototype.prototype;
Prototype p1 = p0.clone();
System.out.println(p0 == p1);
System.out.println(p0.count == p1.count);
System.out.println(p0.shallowCopy == p1.shallowCopy);
}
}
class ShallowCopy implements Cloneable {
public ShallowCopy clone() throws CloneNotSupportedException {
return (ShallowCopy) super.clone();
}
}
- System.out.println(p0 == p1);输出false;说明clone后的对象实例是在内存中开辟的新空间。
- System.out.println(p0.count == p1.count);输出true;其实对于基本数据类型来说,数值是存放在对象容器中的,既然对象实例是新开辟的内存空间,数值自然也是复制一份。
- System.out.println(p0.shallowCopy == p1.shallowCopy);输出true;说明clone的原型对象实例中引用的对象的实例并没有重新开辟内存进行复制,只是复制了对引用对象实例的引用,即“浅拷贝”。
- // prototype.shallowCopy = this.shallowCopy.clone();解开注释后,System.out.println(p0.shallowCopy == p1.shallowCopy);输出false;说明可以通过对clone对象实例中引用对象同样执行clone来进行深一些层次的拷贝,但是如果对象实例的引用对象不对引用对象的引用对象显式执行clone,无法达到传递拷贝,即完全深拷贝。
- 当然通过IO操作实现序列化、反序列化对象可以达到深拷贝的效果。
- 案例鉴赏
Spring中的原型模式。
public abstract class AbstractBeanDefinition extends BeanMetadataAttributeAccessor
implements BeanDefinition, Cloneable {
// ...
public static final String SCOPE_DEFAULT = "";
private String scope = SCOPE_DEFAULT;
public void setScope(String scope) {
this.scope = scope;
}
public String getScope() {
return this.scope;
}
/**
* Return whether this a <b>Singleton</b>, with a single shared instance
* returned from all calls.
* @see #SCOPE_SINGLETON
*/
public boolean isSingleton() {
return SCOPE_SINGLETON.equals(scope) || SCOPE_DEFAULT.equals(scope);
}
/**
* Return whether this a <b>Prototype</b>, with an independent instance
* returned for each call.
* @see #SCOPE_PROTOTYPE
*/
public boolean isPrototype() {
return SCOPE_PROTOTYPE.equals(scope);
}
/**
* Public declaration of Object‘s {@code clone()} method.
* Delegates to {@link #cloneBeanDefinition()}.
* @see Object#clone()
*/
public Object clone() {
return cloneBeanDefinition();
}
/**
* Clone this bean definition.
* To be implemented by concrete subclasses.
* @return the cloned bean definition object
*/
public abstract AbstractBeanDefinition cloneBeanDefinition();
// ...
}
以上是关于设计模式-原型(Prototype)的主要内容,如果未能解决你的问题,请参考以下文章