鍍金池/ 教程/ Java/ 工廠三兄弟之簡單工廠模式(二)
工廠三兄弟之抽象工廠模式(五)
復(fù)雜對象的組裝與創(chuàng)建——建造者模式(一)
工廠三兄弟之工廠方法模式(一)
復(fù)雜對象的組裝與創(chuàng)建——建造者模式(二)
確保對象的唯一性——單例模式 (二)
工廠三兄弟之簡單工廠模式(四)
確保對象的唯一性——單例模式 (一)
工廠三兄弟之工廠方法模式(四)
對象的克隆——原型模式(一)
工廠三兄弟之抽象工廠模式(二)
工廠三兄弟之工廠方法模式(三)
工廠三兄弟之抽象工廠模式(一)
工廠三兄弟之抽象工廠模式(四)
確保對象的唯一性——單例模式 (三)
工廠三兄弟之簡單工廠模式(三)
對象的克隆——原型模式(二)
復(fù)雜對象的組裝與創(chuàng)建——建造者模式(三)
對象的克隆——原型模式(四)
確保對象的唯一性——單例模式(四)
工廠三兄弟之簡單工廠模式(一)
工廠三兄弟之簡單工廠模式(二)
對象的克隆——原型模式(三)
工廠三兄弟之抽象工廠模式(三)
確保對象的唯一性——單例模式(五)
工廠三兄弟之工廠方法模式(二)

工廠三兄弟之簡單工廠模式(二)

簡單工廠模式并不屬于 GoF 23 個經(jīng)典設(shè)計模式,但通常將它作為學(xué)習(xí)其他工廠模式的基礎(chǔ),它的設(shè)計思想很簡單,其基本流程如下:

首先將需要創(chuàng)建的各種不同對象(例如各種不同的 Chart 對象)的相關(guān)代碼封裝到不同的類中,這些類稱為具體產(chǎn)品類,而將它們公共的代碼進(jìn)行抽象和提取后封裝在一個抽象產(chǎn)品類中,每一個具體產(chǎn)品類都是抽象產(chǎn)品類的子類;然后提供一個工廠類用于創(chuàng)建各種產(chǎn)品,在工廠類中提供一個創(chuàng)建產(chǎn)品的工廠方法,該方法可以根據(jù)所傳入的參數(shù)不同創(chuàng)建不同的具體產(chǎn)品對象;客戶端只需調(diào)用工廠類的工廠方法并傳入相應(yīng)的參數(shù)即可得到一個產(chǎn)品對象。

簡單工廠模式定義如下:

簡單工廠模式(Simple Factory Pattern):定義一個工廠類,它可以根據(jù)參數(shù)的不同返回不同類的實例,被創(chuàng)建的實例通常都具有共同的父類。因為在簡單工廠模式中用于創(chuàng)建實例的方法是靜態(tài)(static)方法,因此簡單工廠模式又被稱為靜態(tài)工廠方法(Static Factory Method)模式,它屬于類創(chuàng)建型模式。

簡單工廠模式的要點在于:當(dāng)你需要什么,只需要傳入一個正確的參數(shù),就可以獲取你所需要的對象,而無須知道其創(chuàng)建細(xì)節(jié)。簡單工廠模式結(jié)構(gòu)比較簡單,其核心是工廠類的設(shè)計,其結(jié)構(gòu)如圖所示:

http://wiki.jikexueyuan.com/project/design-pattern-creation/images/20130711143612921.jpg" alt="簡單工廠模式結(jié)構(gòu)圖" />

在簡單工廠模式結(jié)構(gòu)圖中包含如下幾個角色:

  • Factory(工廠角色):工廠角色即工廠類,它是簡單工廠模式的核心,負(fù)責(zé)實現(xiàn)創(chuàng)建所有產(chǎn)品實例的內(nèi)部邏輯;工廠類可以被外界直接調(diào)用,創(chuàng)建所需的產(chǎn)品對象;在工廠類中提供了靜態(tài)的工廠方法 factoryMethod(),它的返回類型為抽象產(chǎn)品類型 Product。

  • Product(抽象產(chǎn)品角色):它是工廠類所創(chuàng)建的所有對象的父類,封裝了各種產(chǎn)品對象的公有方法,它的引入將提高系統(tǒng)的靈活性,使得在工廠類中只需定義一個通用的工廠方法,因為所有創(chuàng)建的具體產(chǎn)品對象都是其子類對象。

  • ConcreteProduct(具體產(chǎn)品角色):它是簡單工廠模式的創(chuàng)建目標(biāo),所有被創(chuàng)建的對象都充當(dāng)這個角色的某個具體類的實例。每一個具體產(chǎn)品角色都繼承了抽象產(chǎn)品角色,需要實現(xiàn)在抽象產(chǎn)品中聲明的抽象方法。

在簡單工廠模式中,客戶端通過工廠類來創(chuàng)建一個產(chǎn)品類的實例,而無須直接使用 new 關(guān)鍵字來創(chuàng)建對象,它是工廠模式家族中最簡單的一員。

在使用簡單工廠模式時,首先需要對產(chǎn)品類進(jìn)行重構(gòu),不能設(shè)計一個包羅萬象的產(chǎn)品類,而需根據(jù)實際情況設(shè)計一個產(chǎn)品層次結(jié)構(gòu),將所有產(chǎn)品類公共的代碼移至抽象產(chǎn)品類,并在抽象產(chǎn)品類中聲明一些抽象方法,以供不同的具體產(chǎn)品類來實現(xiàn),典型的抽象產(chǎn)品類代碼如下所示:

abstract class Product {
    //所有產(chǎn)品類的公共業(yè)務(wù)方法
    public void methodSame() {
        //公共方法的實現(xiàn)
    }

    //聲明抽象業(yè)務(wù)方法
    public abstract void methodDiff();
}

在具體產(chǎn)品類中實現(xiàn)了抽象產(chǎn)品類中聲明的抽象業(yè)務(wù)方法,不同的具體產(chǎn)品類可以提供不同的實現(xiàn),典型的具體產(chǎn)品類代碼如下所示:

class ConcreteProduct extends Product {
    //實現(xiàn)業(yè)務(wù)方法
    public void methodDiff() {
        //業(yè)務(wù)方法的實現(xiàn)
    }
}

簡單工廠模式的核心是工廠類,在沒有工廠類之前,客戶端一般會使用 new 關(guān)鍵字來直接創(chuàng)建產(chǎn)品對象,而在引入工廠類之后,客戶端可以通過工廠類來創(chuàng)建產(chǎn)品,在簡單工廠模式中,工廠類提供了一個靜態(tài)工廠方法供客戶端使用,根據(jù)所傳入的參數(shù)不同可以創(chuàng)建不同的產(chǎn)品對象,典型的工廠類代碼如下所示:

class Factory {
    //靜態(tài)工廠方法
    public static Product getProduct(String arg) {
        Product product = null;
        if (arg.equalsIgnoreCase("A")) {
            product = new ConcreteProductA();
            //初始化設(shè)置product
        }
        else if (arg.equalsIgnoreCase("B")) {
            product = new ConcreteProductB();
            //初始化設(shè)置product
        }
        return product;
    }
}

在客戶端代碼中,我們通過調(diào)用工廠類的工廠方法即可得到產(chǎn)品對象,典型代碼如下所示:

class Client {
    public static void main(String args[]) {
        Product product; 
        product = Factory.getProduct("A"); //通過工廠類創(chuàng)建產(chǎn)品對象
        product.methodSame();
        product.methodDiff();
    }
}