设计模式入门之原型模式Prototype

本文介绍原型模式的概念及其在订单业务中的应用实例。通过克隆现有对象而非新建实例的方式创建新对象,解决了面向接口编程时对象复制的问题。同时探讨了浅度克隆与深度克隆的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//原型模式:用原型实例指定创建对象的种类,并通过拷贝这些原型创建新的对象
//简单来说,当进行面向接口编程时,如果需要复制这一接口对象时,由于不知道他的具体类型而且不能实例化一个接口
//这时就需要用到原型模式,让你在不知道对象具体类型的情况下进行对象的复制
//原型模式功能: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方法
//而且如果该对象所处的层级较高,即其中包含有多种对象,对象中又包含对象,递归克隆起来可能会非常麻烦

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值