天天看點

設計模式:工廠方法

工廠方法模式的定義

定義一個用于建立對象的接口, 讓子類決定執行個體化哪一個類。 工廠方法使一個類的執行個體化延遲到其子類。

工廠方法模式的通用類圖如圖所示。

設計模式:工廠方法

在工廠方法模式中, 抽象産品類Product負責定義産品的共性, 實作對事物最抽象的定義; Creator為抽象建立類, 也就是抽象工廠, 具體如何建立産品類是由具體的實作工廠ConcreteCreator完成的。

/**
 * 抽象産品類
 */
public abstract class Product {
    //産品類的公共方法
    public void method1(){
    //業務邏輯處理
    }
    //抽象方法
    public abstract void method2();
}
/**
 * 具體産品類
 */
public class ConcreteProduct1 extends Product {
    public void method2() {
        //業務邏輯處理
    }
}
public class ConcreteProduct2 extends Product {
    public void method2() {
        //業務邏輯處理
    }
}
           

具體的産品類可以有多個, 都繼承于抽象産品類。

public abstract class Creator {
    /*
     * 建立一個産品對象, 其輸入參數類型可以自行設定
     * 通常為String、 Enum、 Class等, 當然也可以為空
     */
    public abstract <T extends Product> T createProduct(Class<T> c);
}
/**
 * 具體工廠類
 */
public class ConcreteCreator extends Creator {
    public <T extends Product> T createProduct(Class<T> c){
    Product product=null;
    try {
        product = (Product)Class.forName(c.getName()).newInstance();
    } catch (Exception e) {
        //異常處理
    }
    return (T)product;
    }
}
           

具體如何産生一個産品的對象, 是由具體的工廠類實作的

工廠方法模式的優點

  • 良好的封裝性, 代碼結構清晰。 一個對象建立是有條件限制的, 如一個調用者需要一個具體的産品對象, 隻要知道這個産品的類名( 或限制字元串) 就可以了, 不用知道建立對象的艱辛過程, 降低子產品間的耦合。
  • 工廠方法模式的擴充性非常優秀。 在增加産品類的情況下, 隻要适當地修改具體的工廠類或擴充一個工廠類, 就可以完成“擁抱變化”。
  • 工廠方法模式是典型的解耦架構。 高層子產品值需要知道産品的抽象類, 其他的實作類都不用關心, 符合迪米特法則, 我不需要的就不要去交流; 也符合依賴倒置原則, 隻依賴産品類的抽象; 當然也符合裡氏替換原則, 使用産品子類替換産品父類, 沒問題

繼續閱讀