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