面試官都愛問的java設計模式(工廠模式)

簡言:

java有二十三種設計模式,面試時幾乎面試官都會問你知道哪些設計模式,單例模式,裝飾模式,工廠模式,外觀模式,建造者模式,適配器模式等等,不單單面試中需要你的瞭解滲透,在實際開發中也是大有用途的。今天主要說的是工廠模式,會以案例的形式講解。

簡單理解什麼是工廠:

簡單說,就是到底要實例化誰,會不會增加實例化對象,所以要用一個單獨的類做這個創建實例的過程,就是工廠;

今天主要講解分爲三部分:

1.什麼是簡單工廠模式

2.什麼是工廠方法模式

3.兩者之間的對比(優缺點)

我們今天通過“計算器” 功能對工廠模式進行講解:

一。簡單工廠模式

工廠類代碼:

public class OperationFactory {

    public static Operation createOperatie(String operate) {
        Operation oper = null;
        switch (operate) {
            case "+":
                oper = new OperationAdd();
                break;
            case "-":
                oper = new OperationSub();
                break;
            case "*":
                oper = new OperationMul();
                break;
            case "/":
                oper = new OperationDiv();
                break;

        }
        return  oper;
    }

}

客戶端實現:

/**
     * 簡單工廠模式
     * */
    private void initUI() {
        Operation oper = OperationFactory.createOperatie("+");
        oper.setNumA(1);
        oper.setNumB(2);
        double v = oper.GetResult();
        Toast.makeText(FactoryActivity.this, "結果爲:" + v, Toast.LENGTH_SHORT).show();
    }

通過代碼我們能看出,只要輸入運算符號,工廠就實例出合適的對象,通過多態反饋給父類實現的結果;

如果我們添加複雜的運算,比如立方根等,我們添加運算的子類就夠了,在工廠類中添加分支,就能實現。

我將功能運算類分享給大家(計算加減乘除類)

/**
 * 計算加法類 並返回結果
 * */
public class OperationAdd extends Operation {


    @Override
    public double GetResult() {
        double result = 0;
        result = this.getNumA() + this.getNumB();
        return result;
    }
}

/**
 * 計算減法類 並返回結果
 * */
public class OperationSub extends Operation{

    @Override
    public double GetResult() {
        double result = 0;
        result = this.getNumA() - this.getNumB();
        return result;
    }
}

/**
 * 計算乘法類 並返回結果
 * */
public class OperationMul extends Operation {

        @Override
        public double GetResult() {
            double result = 0;
            result = this.getNumA() *  this.getNumB();
            return result;
        }
}


/**
 * 計算除法類並返回結果
 * */
public class OperationDiv extends Operation {
    @Override
    public double GetResult() {
        double result = 0;
        if (this.getNumB() == 0) {
            return 0;
        } else {
            result = this.getNumA() / this.getNumB();
            return result;
        }

    }
}

二.工廠方法模式

步驟:

1.創建一個工廠接口,運算類分別實現該接口

/**
 * 創建一個工廠接口
 * */
public interface IFatory {
    Operation CreateOperation();
}

2.運算類建一個具體工廠去實現這個接口

/**
 * 創建一個加法工廠,實現工廠接口
 * */
public class AddFatory implements IFatory {
    @Override
    public Operation CreateOperation() {
        return new OperationAdd();
    }
}


/**
 * 創建一個減法工廠,實現工廠接口
 * */
public class SubFactory implements IFatory {
    @Override
    public Operation CreateOperation() {
        return new OperationSub();
    }
}

/**
 * 創建一個除法工廠,實現工廠接口
 * */
public class DivFactory implements IFatory {
    @Override
    public Operation CreateOperation() {
        return new OperationDiv();
    }
}


/**
 * 創建一個乘法工廠,實現工廠接口
 * */

public class MulFactory implements IFatory {
    @Override
    public Operation CreateOperation() {
        return new OperationMul();
    }
}

在客戶端實現功能得到結果:


    /**
     * 工廠方法模式
     * */
    private void initUI2() {
        IFatory operFactory = new AddFatory();
        Operation operation = operFactory.CreateOperation();
        operation.setNumA(3);
        operation.setNumB(5);
        double v = operation.GetResult();
        Toast.makeText(FactoryActivity.this, "結果爲:" + v, Toast.LENGTH_SHORT).show();
    }

三: 簡單工廠 VS 工廠方法

他們的區別所在,簡單工廠模式的最大優點就在於工廠類中包含了必要的邏輯判斷,根據客戶端的選擇動態的實例化相關的類,

對於客戶端來說,祛除了與產品的依賴

當時如果加入一個立方根功能。我們要在運算的工廠類方法中添加case 分支,相當於對外擴展開放了,對修改也開放了,違背了

開放--封閉原則;這個時候我們選擇了工廠方法:

兩者的結構圖:

          

總結:

工廠方法約束了簡單工廠違背的開放-封閉原則的缺點,又保持了封裝對象創建過程的優點。它們都是集中封裝了對象的創建,更換對象時,不需要大的改動,降低了客戶程序與產品對象的耦合,工廠方法模式就是簡單工廠模式的進一步的優化,由於使用了多態性,保持了簡單工廠模式的優點,克服了缺點;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章