在Java 语言中已提供了clone 方法,定义在Object 类中。下面看看怎么使用Java 里面的克隆方法来实现原型模式。
需要具有克隆功能的类,只需要实现java.lang.Cloneable接口,这个接口没有需要实现的方法,是一个标识接口。

public interface OrderApi {
public int getOrderProductNum();
public void setOrderProductNum(intnum);
/**
* 克隆方法
* @return 订单原型的实例
*/
public Obeject clone()throws
CloneNotSupportedException ;
}
/**
* 个人订单对象
*
*/
public class PersonalOrderimplements OrderApi , Cloneable{
private String
customerName;
private String
productId;
private int orderProductNum= 0;
@Override
public int getOrderProductNum() {
return this.orderProductNum;
}
@Override
public void setOrderProductNum(intnum) {
this.orderProductNum= num;
}
@Override
public Objectclone()
throws CloneNotSupportedException {
// 与自定义克隆方法的区别
PersonalOrder order = (PersonalOrder)super.clone();
return order;
}
@Override
public String toString() {
return "订购人是 =" +
this.customerName+
",订购产品是 =" +this.productId+
",订购的数量为=" +this.orderProductNum;
}
省略setter 和 getter.........
}
/**
* 企业订单对象
*
*/
public class EnterpriseOrderimplements OrderApi , Cloneable{
private String
enterpriseName;
private String
productId;
private intorderProductNum
= 0;
@Override
public int getOrderProductNum() {
return this.orderProductNum;
}
@Override
public void setOrderProductNum(intnum) {
this.orderProductNum= num;
}
@Override
public Objectclone()
throwsCloneNotSupportedException {
// 与自定义克隆方法的区别
EnterpriseOrder order = (EnterpriseOrder )super.clone();
return order;
}
@Override
public String toString() {
return "订购企业是=" +this.enterpriseName+ ",订购产品是=" +
this.productId+
",订购数量为=" + this.orderProductNum;
}
省略setter 和 getter.........
}
public class OrderBusiness {
public static final int ORDER_NUMBER_MAX= 1000;
public void saveOrder(OrderApi order)throws
CloneNotSupportedException{
int orderCount = 1;
OrderApi newOrder = null;
while(order.getOrderProductNum() >ORDER_NUMBER_MAX){
newOrder = (OrderApi)order.clone();
newOrder.setOrderProductNum(ORDER_NUMBER_MAX);
order.setOrderProductNum(order.getOrderProductNum() -
ORDER_NUMBER_MAX);
System.out.println("订单_" + orderCount + "== " + newOrder);
orderCount++;
}
System.out.println("订单_" + orderCount + " == " + order);
}
}