設計模式:創建型->工廠模式

在我們平常創建對象的時候,都是通過關鍵字 new 來實現的,例:Class A = new A() 。
 
在一些情況下,要創建的對象需要一系列複雜的初始化操作,比如查配置文件、查數據庫表、初始化成員對象等,如果把這些邏輯放在構造函數中,會極大影響代碼的可讀性。不妨定義一個類來專門負責對象的創建,這樣的類就是工廠類,這種做法就是工廠模式,在任何需要生成複雜對象的地方,都可以使用工廠模式。
 
工廠模式包括:簡單工廠(不在23種設計模式中)、工廠方法抽象工廠
 

簡單工廠

簡單工廠一開始真的很簡單

public class MaskFactory {

    public Mask createMask() {
        Mask mask = new Mask();
        // .....
        // 100行初始化代碼
        return mask;
    }
}

口罩工廠類只需要new一個口罩對象,配置好,返回即可

 

但假如我們需要口罩類的子類,就會比較判斷,變成了要加if-else了

假設口罩類是個接口,有兩個子類“高端口罩”和“低端口罩”分別實現了這個接口:

public interface IMask {
    void show();
}

public class HighEndMask implements IMask {
    @Override
    public void show() {
        System.out.println("我是高端口罩");
    }
}

public class LowEndMask implements IMask {
    @Override
    public void show(){
        System.out.println("我的低端口罩");
    }

}

在工廠中(還是口罩工廠),通過加if-else判斷來生產對象

public class MaskFactory{

    public IMask createMask(String type) {
        IMask mask = null;
        if("高端口罩".equals(type)){
            mask = new HighEndMask();
            // .....
            // HighEndMask的100行初始化代碼
        }else if("低端口罩".equals(type)){
            mask =  new LowEndMask();
            // .....
            // LowEndMask的100行初始化代碼
        }
        return mask;
    }
}

客戶端傳遞字符串參數,枚舉什麼的,都行

public class Test {

    public static void main(String[] args) {
        MaskFactory factory = new MaskFactory();
        IMask maskA = factory.createMask("高端口罩");
        IMask maskB = factory.createMask("低端口罩");
        maskA.show();
        maskB.show();
    }
}

不過這違反了開閉原則,對“擴展”開放,對“修改”封閉

 

工廠方法模式

每一個口罩子類都對應一個工廠的子類

public interface IMaskFactory {
    IMask createMask();
}

public class HighEndFactory implements IMaskFactory{

    @Override
    public IMask createMask() {
        IMask mask =  new HighEndMask();
        // .....
        // HighEndMask的100行初始化代碼
        return mask;
    }
}

public class LowEndFactory implements IMaskFactory{

    @Override
    public IMask createMask() {
        IMask mask =  new LowEndMask();
        // .....
        //  LowEndMask的100行初始化代碼
        return mask;
    }
}

客戶端調不同的工廠即可

public class Test {

    public static void main(String[] args) {
        IMaskFactory factoryA = new LowEndFactory();
        IMaskFactory factoryB = new HighEndFactory();
        IMask maskA = factoryA.createMask();
        IMask maskB = factoryB.createMask();
        maskA.show();
        maskB.show();
    }
}

這一看就感覺一眼難盡。。。

 

抽象工廠

https://zhuanlan.zhihu.com/p/243277598

等等再寫

 

 

 

 

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