原型模式
原型模式结构:
- “原型”接口 -->(声明克隆方法)
- 一个“原型”对象 -->(实现克隆方法)
原型模式特点:
- 又叫作“克隆(clone)模式”,原型对象(被复制者)是一个支持克隆(实现克隆方法)的对象。
- 能够复制已有对象,而又不用使代码依赖这个对象所属的类。
讲个故事:
原型模式从结构上看比较简单,就不讲故事了,直接上码吧。^ _ ^
原型接口:
// 规定clone方法,接口和抽象类都可以
public abstract class ProtoType{
public abstract ProtoType clone();
}
再看原型对象:
// 对象内部实现clone方法
public class ConcreteType extends ProtoType{
@Override
public ProtoType clone() {
System.out.println("clone成功");
return new ConcreteType();
}
}
客户端代码:
public class client {
public static void main(String[] args){
ConcreteType concreteType1 = new ConcreteType();
ConcreteType concreteType2 = (ConcreteType) concreteType1.clone();
if(concreteType1 == concreteType2){
System.out.println("concreteType1 == concreteType2");
}else{
System.out.println("concreteType1 != concreteType2");
}
}
}
原型模式总结:
- 原型模式将克隆过程委派给被克隆的实际对象。这样做有几个好处:
第一是无需依赖被克隆对象的类;
第二是避免了外部克隆的弊端:私有变量可能无法复制(外部克隆:新建一个属于相同类的对象,然后遍历原始对象的所有成员变量, 并将成员变量值复制到新对象中);
第三是可以克隆预生成原型, 避免反复运行初始化代码(被克隆的对象是不会调用构造方法的,因为clone的时候是直接从内存中获取数据的);
第四是可以方便地生成复杂对象。 - 一般来说克隆的套路都很相似:创建一个当前类的对象, 然后将原始对象所有的成员变量值复制到新建的类中。当然,具体的克隆过程可以视具体需求而定。
- 说到克隆,也就是拷贝,肯定会涉及到深拷贝和浅拷贝两个概念,进而涉及到java中的基本类型和引用类型。这些知识这里就不细说了,百度谷歌一下。
- 本例中是自己定义了“原型接口”,网上很多原型模式的例子中,是直接让具体对象实现cloneable接口的,而这个接口是定义了clone方法的(ps.这个clone是浅拷贝)。
共同学习,欢迎交流!
这里是源码