1. 程式人生 > >Java模板模式之淺拷貝

Java模板模式之淺拷貝

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());
        }
    }

}

最後的執行效果:
這裡寫圖片描述