原型模式例题
订单处理系统
- 现在有一个订单处理系统,里面有一个保存订单的业务功能,需求:每当订单的预定产品数量超过1000的时候,就需要把你单拆成两份订单来保存。如果拆成两份后还是超过1000,则继续拆分,直到每份产品预订数量不超过1000.
- 根据业务,目前的订单系统分成两种,一种是个人订单,一种是公司订单。
- 客户名称、产品对象(ID,Name),订购产品数量。
- 公司名称、 产品对象(ID, Name) ,订购产品数量。
思路
- 首先,定义一个产品类,以便生成产品对象,由于Visual CHM文档里面的clone函数使用protected来修饰的,所以在继承Cloneable接口的类中用的是protected。
- 订单类中,除了增加了一个产品类的对象,其余和产品类差不多。
- 客户端中,为了存储不同类型的数据,采用数组是非常麻烦的,因此采用了ArrayList。
UML 图
代码
产品类
public class Product implements Cloneable {
private int ID;
private String name;
public Product() {
super();
}
public Product(int iD, String name) {
super();
ID = iD;
this.name = name;
}
public int getID() {
return ID;
}
public void setID(int iD) {
ID = iD;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return " ID:"+ID+" Name:"+name;
}
}
订单类
public class Order implements Cloneable {
private int num;
private String name;
private Product product;
public Order() {
super();
}
public Order(int num, String name, Product product) {
super();
this.num = num;
this.name = name;
this.product = product;
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
@Override
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
@Override
public String toString() {
return "订单数目:"+num+" 订单类型:"+name+product.toString();
}
}
客户端
public class Main {
public static void main(String[] args) throws CloneNotSupportedException {
int MAX=1000;
List<Order> list = new ArrayList<Order>();
Product product = new Product(1, "产品1");
Order order = new Order(2001,"公司订单",product);
int rest=order.getNum();
while (rest>MAX) {
Order temp = (Order) order.clone();
temp.setNum(MAX);
list.add(temp);
rest=order.getNum()-MAX;
order.setNum(rest);
}
list.add(order);
System.out.println("共有"+list.size()+"份订单");
for (int i=0; i<list.size(); i++) {
System.out.println(list.get(i).toString());
}
}
}