設計模式:工廠方法模式
最近在學習設計模式,記錄下自己的理解。
定義
工廠方法模式標準定義: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);
/*
* 繼續業務處理
*/
}
}
最後
工廠方法使一個類的實例化延遲到其子類。代碼結構清晰,有良好的封裝性,調用者不需要知道對象創建的具體過程,降低模塊間的耦合。具有良好的擴展性,在增加產品類的情況下,只要適當修改具體的工廠類或擴展一個工廠類。
參考資料:《設計模式之禪》