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