創(chuàng)建型設(shè)計模式-簡單工廠與工廠方法設(shè)計模式

工廠方法模式一種創(chuàng)建對象的模式植兰,下面通過實際的例子來體會

例子:比如輸入兩個數(shù)字,計算兩個數(shù)字的加減乘除雇庙,然后打印結(jié)果

如果不使用工廠的方式

   @Test
    public void noFactory(){
        operation(8,9,"+");
    }
    
    public int  operation(int numA,int numB,String operation){
            switch (operation){
                case "+":
                    return numA+numB;
                case "-":
                    return numA-numB;
                case "*":
                    return numA*numB;
                case "/":
                    return numA/numB;
                default:
                    return 0;
            }
    }

operation這個方法里邊進(jìn)行了判斷處理谓形,這個方法里邊耦合了具體的計算邏輯灶伊。

如果需要修改case中的一個某個算法疆前,就可能會影響到其他的算法,怎么辦呢聘萨?

下面來看下如果改成使用簡單工廠的設(shè)計模式

//定義一個抽象類Operation
public abstract class Operation  {
    
    public double numberA;
    public double numberB;
    //定義一個抽象方法用于獲取結(jié)果
    public abstract double getResult();

}
//加法
public class OperationAdd extends Operation {

    @Override
    public double getResult() {
        return numberA + numberB;
    }
}

//減法
public class OperationSub extends Operation {
    @Override
    public double getResult() {
        return numberA - numberB;
    }
}

//乘法
public class OperationMul extends Operation {

    @Override
    public double getResult() {
        return numberA * numberB;
    }
}

//除法
public class OperationDiv extends Operation {

    @Override
    public double getResult() {
        return numberA / numberB;
    }
}
//定義一個工廠
public class OperationFactory {

    public static Operation createOperation(String operation) {
        Operation op = null;
        switch (operation) {
            case "+":
                op = new OperationAdd();
                break;
            case "-":
                op = new OperationSub();
                break;
            case "*":
                op = new OperationMul();
                break;
            case "/":
                op = new OperationDiv();
                break;
            default:
                Log.e("lpf", "input operation is error");
                break;
        }
        return op;
    }
}

public class Client {
   @Test
    public void testFactory(){
        Operation operation = OperationFactory.createOperation("+");
        operation.numberA=10;
        operation.numberB=16;
        operation.getResult();
    }
}

我們來看下簡單工廠的類圖


image-20211229110855303.png

簡單工廠將算法部分封裝到類里邊了竹椒,那么如果想修改某個算法對其他的不會產(chǎn)生應(yīng)用。

如果需要修改某個算法直接修改對應(yīng)的類就可以米辐,對其他的算法是沒有影響胸完。

那么如果我新增一個算法,就需要在工廠這個類新增一個case翘贮,按照開閉原則里的對修改關(guān)閉的原則赊窥,顯然還是存在問題。怎么辦呢狸页?

我們繼續(xù)對上面的簡單工廠進(jìn)行改造锨能,使用工廠方法的設(shè)計模式

//定義一個抽象類Operation
public abstract class Operation  {
    
    public double numberA;
    public double numberB;
    //定義一個抽象方法用于獲取結(jié)果
    public abstract double getResult();

}
//加法
public class OperationAdd extends Operation {

    @Override
    public double getResult() {
        return numberA + numberB;
    }
}

//減法
public class OperationSub extends Operation {
    @Override
    public double getResult() {
        return numberA - numberB;
    }
}

//乘法
public class OperationMul extends Operation {

    @Override
    public double getResult() {
        return numberA * numberB;
    }
}

//除法
public class OperationDiv extends Operation {

    @Override
    public double getResult() {
        return numberA / numberB;
    }
}

public interface IFactory {
    //抽象工廠,定義操作算法的接口
    Operation concreteOperation();
}
//加法工廠
public class FactoryAdd implements IFactory {

    @Override
    public Operation concreteOperation() {
        return new OperationAdd();
    }
}
//減法工廠
public class FactorySub implements IFactory {

    @Override
    public Operation concreteOperation() {
        return new OperationSub();
    }
}
//乘法工廠
public class FactoryMul implements IFactory{
    @Override
    public Operation concreteOperation() {
        return new OperationMul();
    }
}
//除法工廠
public class FactoryDiv implements IFactory {

    @Override
    public Operation concreteOperation() {
        return new OperationDiv();
    }

}

public class Client {
  @Test
    public void testFactoryMethod(){
         // 需要什么算法直接創(chuàng)建相應(yīng)的算法工廠
        // 需求變更只需要需改某個算法類
        // 需求增加只需要相應(yīng)的增加工廠和算法就可以擴(kuò)展也很方便芍耘。
        IFactory factory=new FactoryAdd();
        Operation operation = factory.concreteOperation();
        operation.numberA=10;
        operation.numberB=16;
        operation.getResult();
    }
}

工廠方法的設(shè)計模式類圖

image-20211229185228642.png

工廠設(shè)計模式總結(jié)

  • 工廠方法模式一種創(chuàng)建對象的模式
  • 能夠很好的封裝方法細(xì)節(jié)
  • 完美的體現(xiàn)了面向接口編程址遇,體現(xiàn)了面向?qū)ο蟮乃枷搿?/li>
  • 編程是一門藝術(shù),大批量的改動顯然是非常丑陋的做法斋竞,用心的琢磨寫的代碼讓它變的更美觀倔约。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市坝初,隨后出現(xiàn)的幾起案子浸剩,更是在濱河造成了極大的恐慌,老刑警劉巖鳄袍,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件绢要,死亡現(xiàn)場離奇詭異,居然都是意外死亡畦木,警方通過查閱死者的電腦和手機(jī)袖扛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蛆封,你說我怎么就攤上這事唇礁。” “怎么了惨篱?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵盏筐,是天一觀的道長。 經(jīng)常有香客問我砸讳,道長琢融,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任簿寂,我火速辦了婚禮漾抬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘常遂。我一直安慰自己纳令,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布克胳。 她就那樣靜靜地躺著平绩,像睡著了一般。 火紅的嫁衣襯著肌膚如雪漠另。 梳的紋絲不亂的頭發(fā)上捏雌,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天,我揣著相機(jī)與錄音笆搓,去河邊找鬼性湿。 笑死,一個胖子當(dāng)著我的面吹牛砚作,可吹牛的內(nèi)容都是我干的窘奏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼葫录,長吁一口氣:“原來是場噩夢啊……” “哼着裹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起米同,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤骇扇,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后面粮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體少孝,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年熬苍,在試婚紗的時候發(fā)現(xiàn)自己被綠了稍走。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片袁翁。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖婿脸,靈堂內(nèi)的尸體忽然破棺而出粱胜,到底是詐尸還是另有隱情,我是刑警寧澤狐树,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布焙压,位于F島的核電站,受9級特大地震影響抑钟,放射性物質(zhì)發(fā)生泄漏涯曲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一在塔、第九天 我趴在偏房一處隱蔽的房頂上張望幻件。 院中可真熱鬧,春花似錦心俗、人聲如沸傲武。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至态兴,卻和暖如春狠持,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背瞻润。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工喘垂, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绍撞。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓正勒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親傻铣。 傳聞我的和親對象是個殘疾皇子章贞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內(nèi)容