原型模式(Prototype)

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


@@@练习示例: 
订单处理系统。


@@@示例代码:
\order\OrderApi.java

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package order;

/**
 * 订单的接口
 */
public interface OrderApi {
    /**
     * 获取订单产品数量
     * @return 订单中产品数量
     */
	public int getOrderProductNum();
	
	/**
	 * 设置订单产品数量
	 * @param num 订单产品数量
	 */
	public void setOrderProductNum(int num);
	
	/**
	 * 克隆方法
	 * @return 订单原型的实例
	 */
	public OrderApi cloneOrder();
}

\order\PersonalOrder.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package order;

/**
 * 个人订单对象
 */
public class PersonalOrder implements OrderApi {
    /**
     * 订购人员姓名
     */
	private String customerName;
	
	/**
	 * 产品编号
	 */
	private String productId;
	
	/**
	 * 订单产品数量
	 */
	private int orderProductNum = 0; 
	
	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 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;
	}
    
	@Override
	public String toString() {
		return "本个人订单的订购人是=" + this.customerName
				+ ", 订购产品是=" + this.productId 
				+ ", 订购数量为=" + this.orderProductNum;
	}
}

\order\EnterpriseOrder.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package order;

/**
 * 企业订单对象
 */
public class EnterpriseOrder implements OrderApi {
    /**
     * 企业名称
     */
	private String enterpriseName;
	
	/**
	 * 产品编号
	 */
	private String productId;
	
	/**
	 * 订单产品数量
	 */
	private int orderProductNum = 0; 
	
	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 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;
	}
    
	@Override
	public String toString() {
		return "本企业订单的订购人是=" + this.enterpriseName
				+ ", 订购产品是=" + this.productId 
				+ ", 订购数量为=" + this.orderProductNum;
	}
}

\order\OrderBusiness.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package order;

/**
 * 处理订单的业务对象
 */
public class OrderBusiness {
    /**
     * 创建订单的方法
     * @param order 订单的接口对象
     */
	public void saveOrder(OrderApi order) {
		// 根据业务要求,当订单预订产品数量超过1000时,就要把订单拆成两份订单
		// 当然如果要做好, 这里的1000应该做成常量,这么做是为演示简单
		
		// 1: 判断当前的预订产品数量是否大于1000
		while (order.getOrderProductNum() > 1000) {
			// 2: 如果大于,还需要继续拆分
			// 2.1 再创建一份订单,跟传入的订单除了数量不一样外,其他都相同
			OrderApi newOrder = order.cloneOrder();
			// 然后进行赋值,产品数量为1000
			newOrder.setOrderProductNum(1000);
			
			// 2.2原来的订单保留,把数量设置成减少1000
			order.setOrderProductNum(order.getOrderProductNum() - 1000);
			
			// 然后是业务功能处理, 省略了, 打印输出看一下
			System.out.println("拆分生成订单==" + newOrder);
		}
		// 3: 不超过1000,那就直接业务功能处理,省略了,打印输出看一下
		System.out.println("订单==" + order);
	}
}

\user\OrderClient.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

package user;

import order.OrderBusiness;
import order.PersonalOrder;

public class OrderClient {
	public static void main(String[] args) {
        // 创建订单对象,这里为了演示,直接new了
		PersonalOrder op = new PersonalOrder();
		// 设置订单数据
		op.setCustomerName("张三");
		op.setProductId("P0001");
		op.setOrderProductNum(2925);
		
		// 这里获取业务处理的类,也直接new了,为了演示简单,连业务接口都没有做
		OrderBusiness ob = new OrderBusiness();
		// 调用业务来保存订单对象
		ob.saveOrder(op);
	}
}

@@@模式的实现:
实现为接口中的一个方法。


@@@模式的优点:
1. 对客户端隐藏具体的实现类型。
2. 使用原型管理器,在运行时可以动态改变具体的实现类型。


@@@模式的缺点:
每个原型的子类都必须实现clone的操作。


@@@模式的本质:
克隆生成对象。


@@@模式体现的设计原则:
NA

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值