//原型模式:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象 //简单来说,当进行面向接口编程时,如果需要复制这一接口对象时,由于不知道他的具体类型而且不能实例化一个接口 //这时就需要用到原型模式,让你在不知道对象具体类型的情况下进行对象的复制 //原型模式功能:1.通过克隆来创建新的对象实例;2.为克隆出来的对象实例复制原型实例属性的值 //实例如下:(未使用Object的clone方法)用来对产品数量超过1000的订单进行分隔,分隔为容量<=1000的N个订单 public interface OrderApi { public int getOrderProductNum(); public void setOrderProductNum(int num); public OrderApi cloneOrder(); } public class PersonalOrder implements OrderApi { private String customerName; private String productId; private int orderProductNum = 0; //各种get,set方法,此处略去N多字 public OrderApi cloneOrder() { PersonalOrder order = new PersonalOrder(); order.setCustomerName(this.customerName); order.setProductId(this.productId); order.setOrderProductNum(this.orderProductNum); return order; } } public class OrderBusiness {//相当于Client public void saveOrder(OrderApi order) { //当使用Object的clone方法时,这样PersonalOrder oa1 = new PersonalOrder(); while(order.getOrderProductNum() >1000) { OrderApi newOrder = order.cloneOrder(); newOrder.setOrderProductNum(1000); order.setOrderProductNum(order.getOrderProductNum(()-1000); System.out.println("拆分订单="+newOrder); } System.out.println("订单="+order);//最后剩下不足1000的订单 } } //============================================================================= //使用Object的clone方法的实现不再写了,主要区别就是:接口是没有clone方法的 //所以在实例化对象时就不能用原来的面向接口了 //原型模式中还有一个问题,即:浅度克隆和深度克隆 //浅度克隆:可以理解为只需要对原对象中的值进行克隆,如果有引用类型(对象),则新对象中的变量是指向原对象的 //深度克隆:不光进行浅度克隆,还要对该对象中所包含的所有引用类型(对象)进行递归克隆 //如果要使用深度克隆,那么该对象中所有的对象都要有clone方法 //而且如果该对象所处的层级较高,即其中包含有多种对象,对象中又包含对象,递归克隆起来可能会非常麻烦