設計模式:工廠方法

工廠方法模式的定義

定義一個用於創建對象的接口, 讓子類決定實例化哪一個類。 工廠方法使一個類的實例化延遲到其子類。

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


在工廠方法模式中, 抽象產品類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;
    }
}

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

工廠方法模式的優點

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

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