設計模式:工廠方法模式

設計模式:工廠方法模式


最近在學習設計模式,記錄下自己的理解。

定義

工廠方法模式標準定義:Define an interface for creating an object,but let subclasses decide which class to instantiate.Factory Method lets a class defer instantiation to subclasses.(定義一個用於創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。)

類圖

工廠方法模式的通用類圖:

工廠方法模式通用類圖

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

代碼

下面來看一個比較實用的通用源碼。

抽象產品類代碼如下:

/*
 * 抽象產品類
 */
public abstract class Product {

    // 產品類的公共方法
    public void method1() {
        // 業務邏輯處理
    }

    // 抽象方法
    public abstract void method2();

}

具體的產品類可以有多個,都繼承於抽象產品類,其源代碼如下:

public class ConcreteProduct1 extends Product {

    @Override
    public void method2() {
        // 業務邏輯處理
    }
}

public class ConcreteProduct2 extends Product {

    @Override
    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 {

    @Override
    public <T extends Product> T createProduct(Class<T> c) {
        T product = null;
        try {
            product = c.newInstance();
        } catch (Exception e) {
            // 異常處理
        }
        return product;
    }

}

場景類的調用方法如下:

public class Client {

    public static void main(String[] args) {
        Creator creator = new ConcreteCreator();
        Product product = creator.createProduct(ConcreteProduct1.class);
        /*
         * 繼續業務處理
         */
    }

}

最後

工廠方法使一個類的實例化延遲到其子類。代碼結構清晰,有良好的封裝性,調用者不需要知道對象創建的具體過程,降低模塊間的耦合。具有良好的擴展性,在增加產品類的情況下,只要適當修改具體的工廠類或擴展一個工廠類。

參考資料:《設計模式之禪》

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