原型模式:通过原型实例,拷贝创建新的对象。
1、类图:
2、实现:
public abstract class AbstractExport implements Cloneable {
protected String exportType;
protected String name;
public String getExportType() {
return exportType;
}
public void setExportType(String exportType) {
this.exportType = exportType;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Object clone() throws CloneNotSupportedException {
return super.clone();
}
public void export() {
System.out.println("export type:" + this.exportType);
System.out.println("export name:" + this.name);
}
}
public class AsyncExport extends AbstractExport {
public AsyncExport() {
super.exportType = "ASYNC";
}
}
public class SyncExport extends AbstractExport {
public SyncExport() {
super.exportType = "SYNC";
}
}
public class ExportTest {
public static void main(String[] args) throws CloneNotSupportedException {
AbstractExport asyncExport = new AsyncExport();
asyncExport.setName("windows");
asyncExport.export();
AbstractExport asyncExportNew = (AbstractExport) asyncExport.clone();
asyncExportNew.export();
System.out.println("======");
AbstractExport syncExport = new SyncExport();
syncExport.setName("windows2");
syncExport.export();
AbstractExport syncExportNew = (AbstractExport) syncExport.clone();
syncExportNew.export();
}
}
3、clone实现的是浅拷贝,如果需要深拷贝,可以在clone中对相应的对象在次进行拷贝并赋值。
4、原型拷贝在想要保留对象原有数据时非常有用。在java中也有其它工具根据实体对象的get、set方法的反射进行字段复制,当然也可以自己根据反射,获取method、field相关信息并进行设置。