1. 程式人生 > >簡單(靜態)工廠模式

簡單(靜態)工廠模式

網址連結1:http://www.cnblogs.com/Bobby0322/p/4178412.html

網址連結2:http://blog.51cto.com/zero01/2067822

 

1. 介紹

簡單工廠模式不能說是一個設計模式,說它是一種程式設計習慣可能更恰當些。因為它至少不是Gof23種設計模式之一。但它在實際的程式設計中經常被用到,而且思想也非常簡單,可以說是工廠方法模式的一個引導,所以我想有必要把它作為第一個講一下。

2. 模式動機 

考慮一個簡單的軟體應用場景,一個軟體系統可以提供多個外觀不同的按鈕(如圓形按鈕、矩形按鈕、菱形按鈕等),這些按鈕都源自同一個基類,不過在繼承基類後不同的子類修改了部分屬性從而使得它們可以呈現不同的外觀,如果我們希望在使用這些按鈕時,

不需要知道這些具體按鈕類的名字,只需要知道表示該按鈕類的一個引數,並提供一個呼叫方便的方法,把該引數傳入方法即可返回一個相應的按鈕物件,此時,就可以使用簡單工廠模式。

 

3. 模式定義

簡單工廠模式(Simple Factory Pattern):又稱為靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式。在簡單工廠模式中,可以根據引數的不同返回不同類的例項。簡單工廠模式專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。

 

4. 模式結構

 

簡單工廠模式包含如下角色:

 

Factory:工廠角色

 

Product:抽象產品角色

 

ConcreteProduct:具體產品角色

 

5. 案例圖解

6. 案例

6.1 定義一個介面:

public interface Operation {


    public double getResult(double numberA,double numberB) throws Exception;


}

6.2 定義具體的計算類:

public class Add implements Operation{


    // 加法計算

    public double getResult(double numberA, double numberB) {

        return numberA + numberB;

    }

}



public class Sub implements Operation{

    // 減法計算

    public double getResult(double numberA, double numberB) {

        return numberA-numberB;

    }

}



public class Mul implements Operation{

    // 乘法計算

    public double getResult(double numberA, double numberB) {

        return numberA * numberB;

    }

}



public class Div implements Operation {

    // 除法計算

    public double getResult(double numberA, double numberB) throws Exception {

        if (numberB == 0) {

            throw new Exception("除數不能為0!");

        }

        return numberA / numberB;

    }

}

6.3 定義簡單工廠類:

public class EasyFactory {

    // 簡單工廠,根據字串建立相應的物件

    public static Operation createOperation(String name) {

        Operation operationObj = null;

        switch (name) {

            case "+":

                operationObj = new Add();

                break;

            case "-":

                operationObj = new Sub();

                break;

            case "*":

                operationObj = new Mul();

                break;

            case "/":

                operationObj = new Div();

                break;
        }

        return operationObj;

    }

}

6.4 客戶端程式碼:

public class Client {

    public static void main(String[] args) throws Exception {

        Operation add = EasyFactory.createOperation("+");

        Operation sub = EasyFactory.createOperation("-");

        Operation mul = EasyFactory.createOperation("*");

        Operation div = EasyFactory.createOperation("/");


        System.out.println(add.getResult(1, 1));

        System.out.println(sub.getResult(1, 1));

        System.out.println(mul.getResult(1, 1));

        System.out.println(div.getResult(1, 1));

    }

}

執行結果:

2.0

0.0

1.0

1.0

如上,從客戶端的程式碼上可以看到,我們無需提供具體的子類類名,只需要提供一個字串即可得到相應的例項物件。這樣的話,當子類的類名更換或者增加子類時我們都無需修改客戶端程式碼,只需要在簡單工廠類上增加一個分支判斷程式碼即可。

7. 簡單工廠模式的優缺點分析: 

       優點:工廠類是整個模式的關鍵所在。它包含必要的判斷邏輯,能夠根據外界給定的資訊,決定究竟應該建立哪個具體類的物件。使用者在使用時可以直接根據工廠類去建立所需的例項,而無需瞭解這些物件是如何建立以及如何組織的。有利於整個軟體體系結構的優化。

      缺點:由於工廠類集中了所有例項的建立邏輯,這就直接導致一旦這個工廠出了問題,所有的客戶端都會受到牽連;而且由於簡單工廠模式的產品室基於一個共同的抽象類或者介面,這樣一來,若產品的種類增加時,即有不同的產品介面或者抽象類的時候,工廠類就需要判斷何時建立何種種類的產品,更改其中邏輯,這就和建立何種種類產品的產品相互混淆在了一起,違背了單一職責,導致系統喪失靈活性和可維護性。而且更重要的是,簡單工廠模式違背了“開放封閉原則”,就是違背了“系統對擴充套件開放,對修改關閉”的原則,因為當我新增加一個產品的時候必須修改工廠類,相應的工廠類就需要重新編譯一遍。

      總結一下:簡單工廠模式分離產品的建立者和消費者,有利於軟體系統結構的優化;但是由於一切邏輯都集中在一個工廠類中,導致了沒有很高的內聚性,同時也違背了“開放封閉原則”。另外,簡單工廠模式的方法一般都是靜態的,而靜態工廠方法是無法讓子類繼承的,因此,簡單工廠模式無法形成基於基類的繼承樹結構。

8. 簡單工廠模式的實際應用簡介:

      工廠類負責建立的物件比較少:由於建立的物件較少,不會造成工廠方法中的業務邏輯太過複雜。

      客戶端只知道傳入工廠類的引數,對於如何建立物件不關心:客戶端既不需要關心建立細節,甚至連類名都不需要記住,只需要知道型別所對應的引數。 

       作為一個最基本和最簡單的設計模式,簡單工廠模式卻有很非常廣泛的應用,我們這裡以Java中的JDBC操作資料庫為例來說明。

        JDBC是SUN公司提供的一套資料庫程式設計介面API,它利用Java語言提供簡單、一致的方式來訪問各種關係型資料庫。Java程式通過JDBC可以執行SQL語句,對獲取的資料進行處理,並將變化了的資料存回資料庫,因此,JDBC是Java應用程式與各種關係資料進行對話的一種機制。用JDBC進行資料庫訪問時,要使用資料庫廠商提供的驅動程式介面與資料庫管理系統進行資料互動。