大白話講工廠設計模式

show me the code and take to me,作的出來更要說的明白
GitHub項目JavaHouse同步收錄
喜歡就點個讚唄! 你的支持是我分享的動力!java

引入

咱們常常聽到工廠模式,好比說 Spring 用了工廠模式啦,面試也會被問到工廠模式等等,這見工廠模式是平常開發中比較重要的一種設計模式。其實工廠模式也是比較簡單的一種設計模式,這年頭彷佛不瞭解工廠模式,你都很差意思說你學過 編程同樣(手動狗頭)。那麼,容許我靈魂拷問一下,你真的瞭解工廠模式嗎。git

UML類圖

不急,咱們先看看 UML 類圖。學習一下怎麼用 UML 類圖 表示代碼。先看如何表示一個實體類。代碼以下:github

public class B {
    
    private String name;
    private String password;
    
    public void test(){
        
    }
}

這是一個簡單的實體類。他的 看 UML 類圖以下:面試

看完實體類,咱們在來看看接口,代碼以下:編程

public interface B {
    void test();
}

這是一個簡單的接類。通常接口就放幾個方法,不放屬性。他的 看 UML 類圖以下:設計模式

看完實體類和接口,咱們來看看他們有什麼關係吧。先看看繼承關係如何表示:微信

能夠一眼看到他的箭頭特色---空心的。箭頭指向父類。這就是繼承關係表示。ide

看完繼承關係,咱們在看看實現接口如何表示。post

這裏咱們能夠看到與繼承關係相似,不過實現變成虛線,箭頭指向接口類。學習

完了沒有,沒有,咱們在看看依賴關係,這種關係比較弱,通常是一個類做爲另外一個類的參數表示, uml 圖以下:

依賴關係是虛線,半個箭頭

到這裏,以上就是常見的 uml 類圖表示。

簡單工廠

進入正題,什麼是工廠模式,咱們先看看簡單工廠模式,其實簡單工廠模式並非工廠模式,可是他能夠幫助咱們去了解工廠模式,因此咱們先看看簡單工廠模式。

需求:咱們須要作一個能夠加減乘除的計算機,運用到簡單工廠模式。

UML 類圖:

運算類:

import lombok.Data;

@Data
public abstract class Operation {
    private Double numA;
    private Double numB;
    /**
     * 運算方法
     */
    abstract Double getResult();
}

加法類:

public class OperationAdd extends Operation{

    @Override
    Double getResult() {
        return getNumA() + getNumB();
    }
}

乘法類:

public class OperationMul extends Operation{
    @Override
    Double getResult() {
        return getNumA() * getNumB();
    }
}

除法類:

public class OperationDiv extends Operation{
    @Override
    Double getResult() {
        if (getNumB() == 0){
            throw new RuntimeException("除數不能爲零!");
        }
        return getNumA() / getNumB();
    }
}

簡單工廠類:

public class CreateOperationFactory {
    public static Operation createOperation(String operate){
        Operation operation = null;
        switch (operate){
            case "+":
                operation = new OperationAdd();
                System.out.println("這是+法");
                break;
            case "/":
                operation = new OperationDiv();
                System.out.println("這是/法");
                break;
            case "*":
                operation = new OperationMul();
                System.out.println("這是*法");
                break;
        }
        return operation;
    }
}

測試類:

public class Test {
    public static void main(String[] args) {
        Operation operation = CreateOperationFactory.createOperation("+");
        operation.setNumA(1D);
        operation.setNumB(2D);
        System.out.println(operation.getResult());

        operation = CreateOperationFactory.createOperation("*");
        operation.setNumA(1D);
        operation.setNumB(2D);
        System.out.println(operation.getResult());

        operation = CreateOperationFactory.createOperation("/");
        operation.setNumA(1D);
        operation.setNumB(2D);
        System.out.println(operation.getResult());
    }
}

輸出接口:

這是+法
3.0
這是*法
2.0
這是/法
0.5

工廠模式

需求:要再添加一個減法運算,嗯?上面沒有減法運算嗎?我猜大家確定沒有發現上面沒有減法運算。看到的也會覺得我在偷懶了,矇混過關呢。事情並無這麼簡單。

通常來講,加個減法嘛,簡單,我直接就下 工廠類裏面加一個分支不就完事了。哈哈,卻不知,這時候,咱們已經違反一個重要的原則--開放關閉原則。所謂開放關閉原則,咱們不該該修源碼,祖傳代碼你敢動,試試看,而是經過繼承父類或者實現接口去拓展代碼,達到咱們的目的。

uml 類圖:

代碼以下:

public interface IFactory {
    Operation createOperation(String operate);
}


public class OperationAddFactory implements IFactory{
    @Override
    public Operation createOperation(String operate) {
        Operation operation = new OperationAdd();
        System.out.println("這是+法");
        return operation;
    }
}

擡槓

沒錯,這裏是本身槓本身的環節。

什麼工廠模式啊!我本身 new 一個對應的對象不就解決問題了,爲啥要寫一個工廠類出來。(槓上槓啊,這是要搞事情)

嗯?好像我沒法反駁·····是不存在的(用我第三根手指推一推個人眼鏡)。試想一下,一個地方用到就去 new 一下。咱們一下new了十幾個地方,而後發現要來類名,這時候,怎麼辦。一處一處改咯,本身new的對象,哭着也要改完。可是若是用工廠類的話,咱們只須要改一個地方就能夠,就是這麼簡單。

就這一個優勢嗎?我仍是喜歡一個一個new啊。

確定不是(這是一個槓精啊),固然簡單一個new對象,確實不須要寫一個類出來。可是new一個對象並非那麼簡單,咱們須要對象進行一個操做呢。Spring IOC機制默認建立對象是單例的,那麼咱們如今也須要對象是惟一的怎麼辦。這時候,咱們就是能夠在工廠類裏面寫一個單例模式,達到咱們的目的。

以上就是個人擡槓環節。

總結

無論什麼設計模式,其實就是爲了代碼複用,少寫代碼,咱們作明白什麼模式是什麼模式,更要理解這些的做用。正所謂,武術的目的是爲了生髮,戰爭的出發點是爲了和平。總之,就是知其然知其因此然。

看到這裏的都是人才。

參考

https://juejin.im/post/5d318b485188255957377ac3#heading-4
《大話設計模式》
https://www.zhihu.com/question/24843188 -- 工廠設計模式有什麼用?

關注微信公衆號,隨時移動端閱讀

公衆號.jpg

相關文章
相關標籤/搜索