設(shè)計(jì)模式之工廠模式

設(shè)計(jì)模式之工廠模式

標(biāo)簽(空格分隔): 設(shè)計(jì)模式 工廠模式


  • 設(shè)計(jì)模式的感念
  • 設(shè)計(jì)模式的應(yīng)用
  • 工廠設(shè)計(jì)模式的產(chǎn)生
  • 工廠設(shè)計(jì)模式的分類

設(shè)計(jì)模式的概念

所有的事物都是發(fā)展演變而來,萬物都是按照這個(gè)規(guī)律發(fā)展起來的,就拿編程來說,從開始的機(jī)器語(yǔ)言 匯編語(yǔ)言C語(yǔ)言c++ java python ..等等都是不斷的進(jìn)化而來。那么今天所談的主題 設(shè)計(jì)模式也是這發(fā)展而來的,其實(shí)設(shè)計(jì)模式最初是應(yīng)用在建筑方面的,最后才演變到各行各業(yè)。
言歸正傳,什么是設(shè)計(jì)模式?設(shè)計(jì)模式就是某一類問題在特定環(huán)境下的一種解決方案。

設(shè)計(jì)模式的應(yīng)用

設(shè)計(jì)模式在程序設(shè)計(jì)中應(yīng)用的比較廣泛,比如 開源框架Spring中大量用到了工廠模式,也是本文所說的主要內(nèi)容。再有就是Java語(yǔ)言本身IO處理類中所用給到的裝飾模式,其實(shí)我們經(jīng)常也在用這些設(shè)計(jì)模式,只是你不曾發(fā)覺而已,那么為什么要用這些設(shè)計(jì)模式呢? 這個(gè)問題就回到了設(shè)計(jì)模式的感念,這樣來反問一下自己,就不難理解設(shè)計(jì)模式的用途了。其實(shí)就是為了解決問題而出現(xiàn)的一系列的解決方案,并且這些解決方案在處理此類問題的時(shí)候非常的有效。PS:你可以嘗試著不用設(shè)計(jì)模式來查看一下Spring的源碼。你會(huì)有意外的發(fā)現(xiàn)的。

工廠模式的產(chǎn)生

工廠模式產(chǎn)生其實(shí)好比顯示社會(huì)中的工廠,可以反思一下,社會(huì)中為什么需要這些工程,如果沒有了這些工廠會(huì)怎么樣?因?yàn)槲覀兲幱谠谝呀?jīng)發(fā)展的十分發(fā)達(dá)的社會(huì)環(huán)境下,那么我們需要逆推一下這個(gè)過程,如果沒有工廠的存在,假如你需要一個(gè) 自行車 那么你改怎么辦呢? 首先你需要自己煉鐵->打鐵->制作輪子 ....等等一些列的東西都需要你去造出來。對(duì)的,就是這樣的。好吧,想想就是一件可怕的事情。其實(shí)這是一種思維方式 ,同時(shí)也是一種學(xué)習(xí)的方式,學(xué)會(huì)假設(shè)不存在某樣?xùn)|西會(huì)怎么樣,然后作用就變得非常清晰了。

工廠模式的分類

  • 簡(jiǎn)單工廠模式 SimpleFactory
  • 抽象工廠模式 abstractFactory

簡(jiǎn)單工廠模式

何為簡(jiǎn)單工廠模式 : 不是所有的工廠都是全能的工廠,也就是我們社會(huì)中的一些小的加工廠,比方說 你附近的鐵匠鋪,他們只能生產(chǎn)出簡(jiǎn)單而單一的東西。

舉個(gè)例子
計(jì)算器中的加減乘除 我們用簡(jiǎn)單工廠模式來實(shí)現(xiàn)的話 代碼如下
從代碼中可以看出OperationFactory 只能構(gòu)造出特定的 + - * / 這幾個(gè)操作符,試想一下 如果你要求余數(shù)呢?該怎么辦? 辦法有很多 可以直接在switch case 中再追加一條。如果沒有源代碼的情況下該怎么辦呢?那么,就是下面要說的AbstractFactory

OperationFactory
public class OperationFactory {

    public static Operation createOperation(String operationCode) {

        Operation operation = null;

        switch (operationCode) {
            case "+":
                operation = new OperationAdd();
                break;
            case "-":
                operation = new OperationSub();
                break;
            case "*":
                operation = new OperationMul();
                break;
            case "/":
                operation = new OperationDiv();
                break;
            default:
                operation = new OperationAdd();
                break;
        }


        return operation;

    }
Operation
public interface Operation {

    int computer(int x, int y);

}

Operation相關(guān)子類
public class OperationAdd implements Operation {
    @Override
    public int computer(int x, int y) {
        return x+y;
    }
}

public class OperationDiv implements Operation{

    @Override
    public int computer(int x, int y) {
        return x/y;
    }
}

public class OperationMul implements Operation {

    @Override
    public int computer(int x, int y) {
        return x * y ;
    }
}

public class OperationSub implements Operation{
    @Override
    public int computer(int x, int y) {
        return x - y;
    }
}

抽象工廠模式 AbstractFactory

之所以未出現(xiàn)抽象工廠模式,是因?yàn)楹?jiǎn)單工廠模式滿足不了需求,當(dāng)前的需求是需要靈活的擴(kuò)展,也就是說我需要啥都可以去生產(chǎn),如果之前沒有對(duì)應(yīng)的生產(chǎn)方案,我可以增加生產(chǎn)方案只需要增加一條生產(chǎn)鏈而非重新去建立一個(gè)工廠。在代碼中,如果在沒有源碼的情況下,需要對(duì)依賴的源碼做擴(kuò)展,那么不用把依賴中的實(shí)現(xiàn)重現(xiàn)實(shí)現(xiàn)一遍,只需繼承或者實(shí)現(xiàn)源碼里面的某個(gè)類就可以簡(jiǎn)單的做到擴(kuò)展。

說的再多,不如一個(gè)例子可以清晰的展現(xiàn)。在開發(fā)過程中我們經(jīng)常會(huì)遇到支付相關(guān)的東西,比如:支付寶,微信,銀聯(lián)....很多支付。我們考慮設(shè)計(jì)一個(gè)PayFactory的工程,根據(jù)客戶的選擇來采用不用的支付工具。
代碼如下

Pay相關(guān)
    public abstract class Pay {
    public abstract String pay();
}
     public class AliPay extends Pay {
    @Override
    public  String pay() {
        return "支付寶支付";
    }
}

 public class WXPay extends Pay {
    @Override
    public String pay() {
        return "微信支付";
    }
}
PayFactory相關(guān)
public abstract class PayFactory {
    public  abstract Pay createAliPay();
    public  abstract Pay createWxPay();

}
 public class DefaultPayFactory extends PayFactory {


    @Override
    public Pay createAliPay() {
        return new AliPay();
    }

    @Override
    public Pay createWxPay() {
        return new WXPay();
    }
}

如果你需要擴(kuò)展一個(gè)雙錢的錢多多支付,你需要怎么做呢?代碼如下

定制Pay相關(guān)
public class QddPay extends Pay {
    @Override
    public String pay() {
        return "雙錢支付";
    }
}

實(shí)現(xiàn)PayFactory相關(guān)
public class CustomPayFactory extends DefaultPayFactory {

    @Override
    public Pay createAliPay() {
        return super.createAliPay();
    }

    @Override
    public Pay createWxPay() {
        return super.createWxPay();
    }

    public Pay createQddPay() {
        return new QddPay();
    }



}

總結(jié)以上,可以見得工廠模式的作用,以上代碼可以自行運(yùn)行測(cè)試。祝大家學(xué)習(xí)順利

最后編輯于
?著作權(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)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 178,872評(píng)論 25 709
  • 工廠模式是最常用的一類創(chuàng)建型設(shè)計(jì)模式,之前一直以為工廠模式只是23中設(shè)計(jì)模式中的一種,重新了解才知道這個(gè)模式還要細(xì)...
    晨鳴code閱讀 1,354評(píng)論 0 6
  • 一、簡(jiǎn)單工廠模式 簡(jiǎn)單工廠模式又稱靜態(tài)工廠方法模式。它存在的目的很簡(jiǎn)單:將對(duì)象的創(chuàng)建過程封裝進(jìn)一個(gè)類。 先來看看它...
    innovatorCL閱讀 541評(píng)論 0 1
  • 過日子還是稍微接地氣點(diǎn)兒,少不了閱歷經(jīng)歷,學(xué)歷是形而上進(jìn)的某種途徑,而后期的閱讀卻是自我提升的催化劑。 得到尊重,...
    何無所求閱讀 187評(píng)論 0 0
  • 內(nèi)訓(xùn)師如何提升備課效率 1 為什么 1.1 現(xiàn)狀 1.1.1 內(nèi)訓(xùn)師備課效率低,影響培訓(xùn)績(jī)效。 第三季度時(shí),公司的...
    無憂俠閱讀 171評(píng)論 0 0

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