设计模式【九】原型模式

原型模式:通过原型实例,拷贝创建新的对象。

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相关信息并进行设置。


   转载规则


《设计模式【九】原型模式》 Euler 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录