《設計模式之禪》-3.工廠設計模式
阿新 • • 發佈:2018-12-10
工廠設計模式
定義:
定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類
通用程式碼
//抽象產品類 (也可以是功能介面)
public abstract class Product {
//產品的公共方法
public void method1(){
//業務邏輯處理
}
public abstract void method2();
}
具體產品類可以有多個,都繼承於抽象產品類
// 具體產品類 //產品類1 public class ConcreteProduct1 extends Product { public void method2(){ //doSomething.... }; } //產品類2 public class ConcrteteProduct2 extends Product { public void method2(){ //doSomething.... }; }
抽象工廠類
//抽象工廠類負責定義產品物件的產生
public abstract class Creator {
public abstract <T extends Product> T createProduct (Class<T> c);
}
注意:
<T extends Product> T 必須是Product 的實現類
Class<T> c 必須是class型別
T表示的是 只要實現了Product的類都可以作為引數,泛型是jdk1.5中一個非常重要的特性,他減少了物件間的轉換,約束其輸入引數型別
具體工廠類
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; } }
場景類的呼叫
public class Client {
public static void main(String[] args) {
Creator creator = new Creator();
Product product = creator.createProduct(ConcteteProduct1.class);
product.method2();
}
}
工廠模式的優點:
1.良好的封裝性,程式碼結構清晰,擴充套件性優秀,在增加產品類的情況下,只要適當的修改具體工廠類或擴充套件一個工廠類,就可以擁抱變化
2.其次,遮蔽產品類,這一特點非常重要,產品類的實現如何變化,呼叫者都不需要關心,它只關心產品的介面,只要介面保持不變,系統中的上層模組就不需要發生變化,最典型的例子就是JDBC連線資料庫,資料庫從mysql切換到oracle,只要修改一下驅動的名稱
3.最後工廠方法模式是典型的解耦框架。高層模組只需要知道產品的抽象類,其他的實現類都不需要關心,符合迪米特法則,我不需要的就不要去交流,也符合依賴倒置原則,只依賴產品的抽象類。當然也符合里氏替換原則,使用產品子類替換產品父類。
jdbc初始化資料庫 相關原始碼 jdbcUtils 類中 使用了工廠模式