原型模式的功能:
① 一个通过克隆来创建新的对象实例;
② 另一个是为克隆出来的新的对象实例复制原型属性的值。
原型实例和克隆出来的实例,本质是不同的实例,克隆完成后,它们之间是没有关联的,如果克隆出来的实例的属性值发生了改变,是不会影响到原型实例的。
public interface OrderApi {
public int getOrderProductNum();
public void setOrderProductNum(int num);
/**
* 克隆方法
* @return 订单原型的实例
*/
public OrderApi cloneOrder();
}
/**
* 个人订单对象
*
*/
public class PersonalOrder implements OrderApi {
private String customerName;
private String productId;
private int orderProductNum = 0;
@Override
public int getOrderProductNum() {
return this.orderProductNum;
}
@Override
public void setOrderProductNum(int num) {
this.orderProductNum = num;
}
@Override
public OrderApi cloneOrder() {
// 创建一个新的订单,然后把本实例的数据复制过去
PersonalOrder order = new PersonalOrder();
order.setCustomerName(this.customerName);
order.setProductId(this.productId);
order.setOrderProductNum(this.orderProductNum);
return order;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
@Override
public String toString() {
return "订购人是 = " + this.customerName + ",订购产品是 =" +this.productId +",订购的数量为=" + this.orderProductNum;
}
}
/**
* 企业订单对象
*
*/
public class EnterpriseOrder implements OrderApi {
private String enterpriseName;
private String productId;
private int orderProductNum = 0;
@Override
public int getOrderProductNum() {
return this.orderProductNum;
}
@Override
public void setOrderProductNum(int num) {
this.orderProductNum = num;
}
@Override
public OrderApi cloneOrder() {
// 创建一个新的订单,然后把本实例的数据复制过去
EnterpriseOrder order = new EnterpriseOrder();
order.setEnterpriseName(this.enterpriseName);
order.setProductId(this.productId);
order.setOrderProductNum(this.orderProductNum);
return order;
}
public String getEnterpriseName() {
return enterpriseName;
}
public void setEnterpriseName(String enterpriseName) {
this.enterpriseName = enterpriseName;
}
public String getProductId() {
return productId;
}
public void setProductId(String productId) {
this.productId = productId;
}
@Override
public String toString() {
return "订购企业是=" + this.enterpriseName + ",订购产品是=" + this.productId +
",订购数量为=" + this.orderProductNum;
}
}
/**
* 处理订单业务对象
*
*/
public class OrderBusiness {
/**
* 一份订单的最大产品数量
*/
public static final int ORDER_NUMBER_MAX = 1000;
/**
* 创建订单的方法
* @param order 订单的接口对象
*/
public void saveOrder(OrderApi order){
int orderNum = 1;
//判断当前的预订的产品数量是否 > 1000
while(order.getOrderProductNum() > ORDER_NUMBER_MAX){
//如果大于,还需要继续拆分
//新建一份订单
OrderApi newOrder = order.cloneOrder();
//传入预订的产品数量
newOrder.setOrderProductNum(ORDER_NUMBER_MAX);
//把原来订单的预订产品数量 - 1000
order.setOrderProductNum(order.getOrderProductNum() - ORDER_NUMBER_MAX);
System.out.println("订单_" + orderNum + " == " + newOrder);
orderNum++;
}
System.out.println("订单_" + orderNum + " == " + order);
}
}
public class Client {
public static void main(String[] args) {
EnterpriseOrder order = new EnterpriseOrder();
order.setEnterpriseName("IBM");
order.setProductId("E001");
order.setOrderProductNum(2950);
new OrderBusiness().saveOrder(order);
}
}