設計模式入門之原型模式Prototype

//原型模式:用原型實例指定創建對象的種類,並通過拷貝這些原型創建新的對象
//簡單來說,當進行面向接口編程時,如果需要複製這一接口對象時,由於不知道他的具體類型而且不能實例化一個接口
//這時就需要用到原型模式,讓你在不知道對象具體類型的情況下進行對象的複製
//原型模式功能: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方法
//而且如果該對象所處的層級較高,即其中包含有多種對象,對象中又包含對象,遞歸克隆起來可能會非常麻煩

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章