@@@模式定义:
用原型实例指定创建对象的种类,然后通过拷贝这些原型创建新的对象。
@@@练习示例:
订单处理系统。
@@@示例代码:
\order\OrderApi.java
\order\PersonalOrder.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\order\EnterpriseOrder.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\order\OrderBusiness.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
\user\OrderClient.java
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@@@模式的实现:
实现为接口中的一个方法。
@@@模式的优点:
1. 对客户端隐藏具体的实现类型。
2. 使用原型管理器,在运行时可以动态改变具体的实现类型。
@@@模式的缺点:
每个原型的子类都必须实现clone的操作。
@@@模式的本质:
克隆生成对象。
@@@模式体现的设计原则:
NA
用原型实例指定创建对象的种类,然后通过拷贝这些原型创建新的对象。
@@@练习示例:
订单处理系统。
@@@示例代码:
\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