工廠方法模式的定義為:
Define an interface for creating an object , but let subclass decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses.(定義一個用于創建對象的接口,讓子類決定實例化哪一個類。工廠方法使一個類的實例化延遲到其子類。)
在工廠方法模式中,抽象產品類Product 負責定義產品的共性,實現對事物最抽象的定義;Creator 為抽象創建類,也就是抽象工廠,具體如何創建產品類是由具體的實現工廠ConcreteCreator完成的。
1.抽象產品類
public abstract class Product {
// 產品類的公共方法
public void method1() {
// 業務邏輯處理
}
// 抽象方法
public abstract void method2();
}
2.具體產品類
public class ConcreteProduct1 extends Product{
@Override
public void method2() {
//業務邏輯處理
}
}
3.抽象工廠類
public abstract class Creator {
public abstract<T extends Product> T createProduct(Class<T> c);
}
4.具體工廠類
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;
}
}
5.場景類
public class Client {
public static void main(String[] args) {
Creator creator=new ConcreteCreator();
Product product=creator.createProduct(ConcreteProduct1.class);
}
}
工廠方法模式的優點
- 良好的封裝性,代碼結構清晰。創建對象時只需要知道類名就可以了,不用知道創建對象的艱辛過程,降低模塊間的耦合度
- 優秀的擴展性,增加產品類時只需要修改具體的工廠類或者新增一個工廠類就可以完成系統的擴展。
- 屏蔽產品類,調用者只需要關心產品的接口,而系統的上層模塊不會發生變化。如使用JDBC連接數據庫,數據庫從MySQL切換到Oracle時只需要切換驅動名稱。
- 工廠方法模式時典型的解耦框架。高層模塊只需要知道產品的抽象類,其他的實現類都不用關心,符合迪米特法則,我不需要的就不要去交流;也符合依賴倒置原則,只依賴產品類的抽象;當然也符合里氏替換原則,使用產品子類替換產品父類。
工廠方法模式的使用場景
- 需要生成對象的地方
- 需要靈活的、可擴展的框架時。如需要設計一個連接郵件服務器的框架,有三種網絡協議可供選擇:IMAP、HTTP、POP3,可以使用這三種連接方法作為產品類。
- 異構項目中。如使用WebService 與一個非Java項目進行交互時。