前言
原型設計模式系列文章
原型設計模式(一) - 定義跳夭、訂單拆分
原型設計模式(二) - 訂單拆分一般寫法實現(xiàn)
原型設計模式(三) - 訂單拆分采用原型設計模式進行改進
原型設計模式(四) - 訂單拆分采用系統(tǒng)自帶的拷貝的方法實現(xiàn)
原型設計模式(五) - 淺拷貝
原型設計模式(六) - 深拷貝
原型設計模式(七) - 使用場景
1. 訂單拆分 - 原型設計模式寫法
原型設計模式就是:通過拷貝復制出一個新的對象敬辣;
實現(xiàn)步驟:
1>:首先定義箱子的接口:IBox捶索,同時在IBox中新增一個 copy()方法;
2>:然后定義具體的出貨物品 - 塑料夾子:PlasticClampBox意鲸,讓它繼承IBox捂寿,然后復寫copy()方法帚稠;
3>:然后再定義具體出貨的物品 - 汽車的零件:CartPartBox,讓它繼承IBox卿叽,然后復寫copy()方法桥胞;
4>:然后再定義裝箱子的卡車:TruckCar;
5>:然后再定義拆分箱子的類:SplitService考婴;
6>:最后定義客戶端測試:Client贩虾;
2. 具體代碼如下
1>:首先定義箱子的接口:IBox,同時在IBox中新增一個 copy()方法:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 17:14
* Version 1.0
* Params:
* Description: 出貨的箱子
*/
public interface IBox {
/**
* 設置箱子的數(shù)量
*/
void setNumber(int number) ;
/**
* 有多少貨
*/
int getNumber() ;
/**
* 新增一個方法 - 拷貝
*/
IBox copy() ;
}
2>:然后定義具體出貨的物品 - 汽車的零件:CartPartBox沥阱,讓它繼承IBox缎罢,然后復寫copy()方法:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 17:17
* Version 1.0
* Params:
* Description: 汽車的零件 - 具體出貨的物品
*/
public class CartPartBox implements IBox {
// 汽車個數(shù)
private int number ;
// 汽車名稱
private String name ;
// 汽車品牌
private String cardBrand ;
@Override
public void setNumber(int number) {
this.number = number ;
}
@Override
public int getNumber() {
return number;
}
@Override
public IBox copy() {
CartPartBox box = new CartPartBox() ;
box.setName(name);
box.setNumber(number);
box.setCardBrand(cardBrand);
return box;
}
public String getCardBrand() {
return cardBrand;
}
public void setCardBrand(String cardBrand) {
this.cardBrand = cardBrand;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
3>:然后再定義裝箱子的卡車:TruckCar:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 17:23
* Version 1.0
* Params:
* Description: 裝箱子的卡車
*/
public class TruckCar {
public IBox box;
/**
* 添加箱子
*/
public void addBox(IBox box){
this.box = box ;
}
/**
* 移除箱子
*/
public IBox removeBox(){
return box ;
}
}
4>:然后再定義拆分箱子的類:SplitService:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 18:42
* Version 1.0
* Params:
* Description: 拆分箱子
*/
public class SplitService {
/**
* 把箱子進行拆分 - 通過 原型設計模式改進,直接調用 IBox的 copy()方法即可
*/
public static List<TruckCar> splitBox(IBox box){
List<TruckCar> carList = new ArrayList<>() ;
while (box.getNumber() > 200){
// 只是在這里調用 IBox的 copy()方法
IBox newBox = box.copy() ;
newBox.setNumber(200);
TruckCar truckCar = new TruckCar() ;
truckCar.addBox(newBox);
carList.add(truckCar) ;
box.setNumber(box.getNumber() - 200);
}
TruckCar truckCar = new TruckCar() ;
truckCar.addBox(box);
carList.add(truckCar) ;
return carList ;
}
}
5>:最后定義客戶端測試:Client:
/**
* Email: 2185134304@qq.com
* Created by Novate 2018/6/2 17:24
* Version 1.0
* Params:
* Description: 采用原型設計模式 - IBox中寫一個 copy()方法
*/
public class Client {
public static void main(String[] args){
CartPartBox box = new CartPartBox() ;
box.setNumber(500);
box.setName("尾燈燈罩");
box.setCardBrand("寶馬");
// 接下來考杉,要去拆分
List<TruckCar> carList = SplitService.splitBox(box) ;
for (TruckCar truckCar : carList) {
System.out.println("數(shù)量:"+truckCar.removeBox().getNumber());
}
}
}
運行結果與一般寫法是一樣的:
數(shù)量:200
數(shù)量:200
數(shù)量:100
3. 原型設計模式與一般寫法區(qū)別
1>:采用原型設計模式策精,也就是在 IBox中新增的 copy()方法,就只需要在 訂單拆分的 SplitService中的 while語句中調用 IBox的 copy()方法就達到了簡化代碼崇棠;
2>:以后如果新增一種對象咽袜,就是和CartPartBox、PlasticClampBox評級類似的對象的話枕稀,就直接讓 該對象繼承 IBox询刹,然后復寫 copy()方法,然后可以直接在 copy()方法中設置該對象的屬性抽莱,也就是說讓每個這樣的類都繼承IBox范抓,復寫 copy()方法,各自在各自的 copy()方法中 創(chuàng)建自己的對象食铐,然后設置該對象的屬性匕垫;
3>:這里其實就相當于是把一般寫法中 while語句中的if...else...代碼分開到每一個對象中的 copy()方法來寫的,嚴格來說并沒有怎么簡化代碼的寫法虐呻;
那么下一節(jié)我們就來看下系統(tǒng)自帶的拷貝的方法象泵;