Prototype —原型模式一

 原型模型的定义:用原型实例 指定创建对象的种类,并通过 拷贝这些原型,创建新的对象。

原型模式的功能:

① 一个通过克隆来创建新的对象实例;

② 另一个是为克隆出来的新的对象实例复制原型属性的值。

原型实例和克隆出来的实例,本质是不同的实例,克隆完成后,它们之间是没有关联的,如果克隆出来的实例的属性值发生了改变,是不会影响到原型实例的。

Java 设计模式 之 原型模式(Prototype) - 低调的华丽 - 辉色空间

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值