核心
使用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
作用
工廠基類實現了產品類的業務邏輯。
優點
- 子類不需要編寫重複實現父類的[產品方法]邏輯。
- 新建商品子類後不需要修改[生產函數]的邏輯。
缺點
- 類多,總體代碼量不一定少,增加閱讀難度。
- 每一個工廠子類與商品子類是有組合的耦合關係。