設計模式(二)——factory method模式

核心

使用template method模式,在工廠基類(即父類)的函數A中封裝抽象函數的調用細節,子類中實現抽象函數的實現細節。工廠基類函數A的函數返回值類型一定是產品類的類型。

加粗的地方就是factory模式與template method模式不同的地方,template method注重的是父類封裝函數調用細節,子類直接使用的關係。factory模式強調的是工廠類中的方法,封裝調用需要子類實現的抽象函數的調用邏輯,邏輯與商品類相關。

實現

abstract class ProductClass{
    /**
     * 商品基類
     *
     **/
    public String name;
    ProductClass(){
        this.name = "";
    }
    ProductClass(String v_name){
        this.name = v_name;
    }
    public abstract void useProduct(ProductClass name);
}
abstract class FactoryClass{
    /**
     * 工廠基類
     *
     **/
    public ProductClass productObj;
     
    public abstract ProductClass generateProduct(String proName);
    public abstract void activityProduct(ProductClass obj);
    
    
    public ProductClass createAndActivityProduct(String proName){
        System.out.println("factoryClass create begin");
        ProductClass proObj = generateProduct(proName);
        System.out.println("factoryClass create end");
        System.out.println("factoryClass activity begin");
        activityProduct(proObj);
        System.out.println("factoryClass activity end");
        return proObj;
    }
}
class FactoryClass_Son extends FactoryClass{
    
    public ProductClass generateProduct(String proName){
        ProductClass object = new ProductClass_Son(proName);
        object.name = proName;
        this.productObj =object;
        System.out.println("generate son Product");
        return object;
    }
    
    public void activityProduct(ProductClass obj){
        ProductClass sonObj = (ProductClass_Son)obj;
        System.out.println("activity son Product " + (String)sonObj.name);
        return ;
    }
}
class ProductClass_Son extends ProductClass{
    ProductClass_Son(){
        this.name = "";
    }
    ProductClass_Son(String name){
        this.name = name;
    }
    
    public void useProduct(ProductClass obj){
        System.out.println("use productClass_Son " + obj.name);
        return;
    }
}
public class Main {
    public static void main(String[] args) {
        FactoryClass_Son v_factoryObj = new FactoryClass_Son();
        String proName = new String("vv_product");
        ProductClass v_productObj = v_factoryObj
                .createAndActivityProduct("vv_product");
        ((ProductClass_Son)v_productObj).useProduct(v_productObj);
        return;
        
    }
}

輸出

factoryClass create begin
generate son Product
factoryClass create end
factoryClass activity begin
activity son Product vv_product
factoryClass activity end
use productClass_Son vv_product

作用

工廠基類實現了產品類的業務邏輯。

優點

  • 子類不需要編寫重複實現父類的[產品方法]邏輯。
  • 新建商品子類後不需要修改[生產函數]的邏輯。

缺點

  • 類多,總體代碼量不一定少,增加閱讀難度。
  • 每一個工廠子類與商品子類是有組合的耦合關係。

 

 

 

 

 

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