在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);
}
}