设计模式->原型模式

107 阅读1分钟

我正在参与掘金创作者训练营第6期,点击了解活动详情

原型模式

原型模式(Prototype Pattern): 使用原型实例指定待创建对象的类型,并且通过复制这个原型来创建新的对象。

这种模式是实现了一个原型接口,该接口用于创建当前对象的克隆。

目的:保护最原始的那一份存档,隐藏复制过程

简单的业务场景

客户产生一个订单,订单有产品的数量,产品名称。公司接手订单并进入内部处理系统。 进入后需要保留最原始的一份数据作为存根,进入生产工厂后,每个工厂只能在一个订单生产最多1000个产品,开始根据订单生产产品。

image.png

代码实现:

定义一个 原型接口 用来复制对象

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