1. 程式人生 > >《設計模式之禪》-3.工廠設計模式

《設計模式之禪》-3.工廠設計模式

工廠設計模式

定義:

定義一個用於建立物件的介面,讓子類決定例項化哪一個類。工廠方法使一個類的例項化延遲到其子類

通用程式碼

//抽象產品類 (也可以是功能介面)
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 類中 使用了工廠模式