我正在参与掘金创作者训练营第6期,点击了解活动详情
原型模式
原型模式(Prototype Pattern): 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。
这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。
目的:保护最原始的那一份存档,隐藏复制过程
简单的业务场景
客户产生一个订单,订单有产品的数量,产品名称。公司接手订单并进入内部处理系统。 进入后需要保留最原始的一份数据作为存根,进入生产工厂后,每个工厂只能在一个订单生产最多1000个产品,开始根据订单生产产品。
代码实现:
定义一个 原型接口 用来复制对象
public interface Prototype {
Prototype clonePrototype();
}
定一个订单接口,用户获取订单的数量和设置订单数量,同时继承Prototype
public interface IOrder extends Prototype {
int getOrderNumber();
void setOrderNumber(int orderNumber);
}
定一个私人订单的类,实现IOrder接口
public class PersonOrder implements IOrder{
private String orderName;
private int orderNumber;
@Override
public int getOrderNumber() {
return orderNumber;
}
@Override
public void setOrderNumber(int orderNumber) {
this.orderNumber = orderNumber;
}
public String getOrderName() {
return orderName;
}
public void setOrderName(String orderName) {
this.orderName = orderName;
}
@Override
public Prototype clonePrototype() {
PersonOrder order = new PersonOrder();
order.setOrderNumber(orderNumber);
order.setOrderName(orderName);
return order;
}
}
定义一个订单处理工厂类
public class OrderDealFactory {
public void dealOrder(IOrder order){
//克隆对象
IOrder iOrder = (IOrder) order.clonePrototype();
int number = order.getOrderNumber();
while(number>0){
System.out.println("原始订单:"+order.hashCode());
iOrder.setOrderNumber(number>=1000?1000:number);
number -= 1000;
}
}
}
最后调用
OrderDealFactory dealFactory=new OrderDealFactory();
PersonOrder personOrder = new PersonOrder();
personOrder.setOrderName("ceshi>>>>>");
personOrder.setOrderNumber(3200);
dealFactory.dealOrder(personOrder);