設(shè)計(jì)模式-簡(jiǎn)單工廠模式

工廠模式一共分為三種,簡(jiǎn)單工廠、工廠模式和抽象工廠。這三種工廠模式都屬于創(chuàng)建型模式。這篇博文主要講解工廠模式的第一種-簡(jiǎn)單工廠模式。

介紹

簡(jiǎn)單工廠模式(Simple Factory Pattern)又稱為靜態(tài)工廠方法(Static Factory Method)模式,它可以根據(jù)參數(shù)的不同返回不同類的實(shí)例。簡(jiǎn)單工廠模式專門定義一個(gè)類來(lái)負(fù)責(zé)創(chuàng)建其他類的實(shí)例,被創(chuàng)建的實(shí)例通常都具有共同的父類。
說(shuō)的簡(jiǎn)單點(diǎn),就是把對(duì)象的創(chuàng)建轉(zhuǎn)移到另一個(gè)類中,通過(guò)傳入不同的參數(shù)獲得不同的對(duì)象,spring中注入實(shí)體也可以看做是工廠模式,因?yàn)榭梢酝ㄟ^(guò)修改不同的bean名字獲得不同的對(duì)象。
其實(shí)博主上一篇的設(shè)計(jì)模式-外觀模式也可用采用工廠來(lái)獲得不同的對(duì)象。

優(yōu)點(diǎn)

工廠類含有必要的判斷邏輯,可以決定在什么時(shí)候創(chuàng)建哪一個(gè)產(chǎn)品類的實(shí)例,客戶端可以免除直接創(chuàng)建產(chǎn)品對(duì)象的責(zé)任,而僅僅“消費(fèi)”產(chǎn)品;簡(jiǎn)單工廠模式通過(guò)這種做法實(shí)現(xiàn)了對(duì)責(zé)任的分割,它提供了專門的工廠類用于創(chuàng)建對(duì)象。
客戶端無(wú)須知道所創(chuàng)建的具體產(chǎn)品類的類名,只需要知道具體產(chǎn)品類所對(duì)應(yīng)的參數(shù)即可,對(duì)于一些復(fù)雜的類名,通過(guò)簡(jiǎn)單工廠模式可以減少使用者的記憶量。
通過(guò)引入配置文件,可以在不修改任何客戶端代碼的情況下更換和增加新的具體產(chǎn)品類,在一定程度上提高了系統(tǒng)的靈活性。

缺點(diǎn)

由于工廠類集中了所有產(chǎn)品創(chuàng)建邏輯,一旦不能正常工作,整個(gè)系統(tǒng)都要受到影響。
使用簡(jiǎn)單工廠模式將會(huì)增加系統(tǒng)中類的個(gè)數(shù),在一定程序上增加了系統(tǒng)的復(fù)雜度和理解難度。
系統(tǒng)擴(kuò)展困難,一旦添加新產(chǎn)品就不得不修改工廠邏輯,在產(chǎn)品類型較多時(shí),有可能造成工廠邏輯過(guò)于復(fù)雜,不利于系統(tǒng)的擴(kuò)展和維護(hù)。
簡(jiǎn)單工廠模式由于使用了靜態(tài)工廠方法,造成工廠角色無(wú)法形成基于繼承的等級(jí)結(jié)構(gòu)。

案例

這邊就采用支付的案例進(jìn)行講解,用戶在選擇商品后進(jìn)行付款,那么付款方式現(xiàn)如今多種多樣,有支付寶、微信、銀聯(lián)等等。這就是一個(gè)可以采用工廠模式的例子。

支付抽象類

public abstract class Pay {
    public void init(){
        System.out.println("支付方式初始化");
    }
    
    public abstract void orderPay();
}

支付寶支付類

public class AliPay extends Pay {

    @Override
    public void orderPay() {
        System.out.println("支付寶支付");
    }

}

微信支付類

public class WechatPay extends Pay {

    @Override
    public void orderPay() {
        System.out.println("微信支付");
    }

}

銀聯(lián)支付類

public class UnionPay extends Pay {

    @Override
    public void orderPay() {
        System.out.println("銀聯(lián)支付");
    }

}

簡(jiǎn)單工廠類
choicePay也可以不用靜態(tài),根據(jù)具體情況使用

public class PayFactory {
    public static Pay choicePay(String payMethod){
        Pay pay = null;
        if ("aliPay".equals(payMethod)) {
            pay = new AliPay();
        } else if ("wechatPay".equals(payMethod)) {
            pay = new WechatPay();
        } else if ("unionPay".equals(payMethod)) {
            pay = new UnionPay();
        }
        
        return pay;
    }
    
    public static void main(String[] args) {
        String payMethod = "aliPay";
        Pay pay = PayFactory.choicePay(payMethod);
        if (pay != null) {
            pay.init();
            pay.orderPay();
        } else {
            System.out.println("未選擇支付方式");
        }
        
    }
}

具體代碼見(jiàn)Github地址

總結(jié)

簡(jiǎn)單工廠將對(duì)象的實(shí)例化抽取出來(lái),可以降低系統(tǒng)的耦合度,使得兩者修改起來(lái)都相對(duì)容易。在調(diào)用工廠類的工廠方法時(shí),由于工廠方法是靜態(tài)方法,使用起來(lái)很方便,可通過(guò)類名直接調(diào)用,而且只需要傳入一個(gè)簡(jiǎn)單的參數(shù)即可,在實(shí)際開(kāi)發(fā)中,還可以在調(diào)用時(shí)將所傳入的參數(shù)保存在XML等格式的配置文件中,修改參數(shù)時(shí)無(wú)須修改任何源代碼。
但是這樣不符合開(kāi)閉原則,如果增加一種支付方式,那么工廠方法便需要更改,這樣也就對(duì)修改也開(kāi)放了。

jdk中也有許多用到簡(jiǎn)單工廠模式的地方 Integer.valueOf()、DateFormat.getDateInstance()等等。。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容