Java模板模式之淺拷貝
阿新 • • 發佈:2018-11-05
public class Client {
//從呼叫者程式碼進入
public static void main(String[] args) {
SmallProduct product=new SmallProduct();
product.setProductNumber(330);
product.setProductName("小產品A類");
DealFactory factory=new DealFactory();
factory.dealProduct(product);
}
//接下來是SmllProduct類程式碼
public class SmallProduct implements BaseProduct {
private int productNumber;
private String productName;
@Override
public int getProductNumber() {
// TODO Auto-generated method stub
return productNumber;
}
@Override
public void setProductNumber(int productNumber) {
// TODO Auto-generated method stub
this.productNumber=productNumber;
}
@Override
public IProType clonePro() {
// TODO Auto-generated method stub
SmallProduct product=new SmallProduct();
product.setProductNumber(productNumber);
product.setProductName(productName);
return product;
}
public String getProductName() {
return productName;
}
public void setProductName(String name) {
this.productName=name;
}
}
產品基類的程式碼
public interface IProType {
public IProType clonePro();
}
public interface BaseProduct extends IProType {
int getProductNumber();
void setProductNumber(int productNumber);
}
最後是工廠類程式碼,呼叫者根本就不用關心怎麼保留初始“product”,呼叫者處理的“product”都是clone過來的,任何的修改都是在clone出來的新產品基礎上進行修改,而原“product”都是不改變的,模板設計很好的隱藏的clone過程。
public class DealFactory {
public void dealProduct(BaseProduct product) {
// 如果不是模板方式,就要分類判斷,不利於拓展
if (product instanceof SmallProduct) {
String name=((SmallProduct) product).getProductName();
System.out.println("test=原地址:" + product.hashCode() + "||名字:" + name);
}
//下面是模板設計模式,
int number = product.getProductNumber();
while (number > 0) {
BaseProduct pro = (BaseProduct) product.clonePro();
pro.setProductNumber(number > 100 ? 100 : number);
number -= 100;
if(product instanceof SmallProduct) {
String name1=((SmallProduct) pro).getProductName();
System.out.print("分流之後=name="+name1);
}
System.out.println("=test=分流之後=number:" + pro.getProductNumber() + "||地址:" + pro.hashCode());
}
}
}
最後的執行效果: