Java設計模式(三)工廠模式學習

工廠模式學習

工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種類型的設計模式屬於 創建型模式 ,它提供了一種創建對象的最佳方式。
在工廠模式中,我們在創建對象時不會對客戶端暴露創建邏輯,並且是通過使用一個共同的接口來指向新創建的對象。


簡單工廠模式

抽象一個麪條基類,麪條有蘭州拉麪、泡麪等種類

public abstract class Noodles {
    /**
     * 描述每種麪條
     */
    public abstract void desc();
}

蘭州拉麪

public class LzNoodles extends Noodles {
    @Override
    public void desc() {
        System.out.println("蘭州拉麪");
    }
}

泡麪

public class PaoNoodles extends Noodles {
    @Override
    public void desc() {
        System.out.println("泡麪");
    }
}

麪條工廠

public class SimpleNoodlesFactory {
    public static final int TYPE_LZ = 1;//蘭州拉麪
    public static final int TYPE_PM = 2;//泡麪

    public static Noodles createNoodles(int type) {
        switch (type) {
            case TYPE_LZ:
                return new LzNoodles();
            case TYPE_PM:
            default:
                return new PaoNoodles();
        }
    }
}

create()方法通常是靜態的,所以也稱之爲靜態工廠
簡單工廠模式每添加一個產品子類,都必須在工廠類中添加一個判斷分支,這違背了開放-封閉原則


工廠方法模式

工廠方法模式就是把簡單工廠中具體的工廠類,劃分成兩層:抽象工廠層+具體的工廠子類層。(一般->特殊)

麪條工廠(抽象工廠類),作用就是生產麪條:

//抽象麪條工廠
public abstract class NoodlesFactory {
    public abstract INoodles create();
}

蘭州拉麪工廠 (具體工廠子類):

public class LzFactory extends NoodlesFactory {
    @Override
    public INoodles create() {
        return new LzNoodles();
    }
}

泡麪工廠 (具體工廠子類):

public class PaoFactory extends NoodlesFactory {
    @Override
    public INoodles create() {
        return new PaoNoodles();
    }
}

具體使用

NoodlesFactory factory1 = new LzFactory();
Noodles LzNoodles = factory1.create();
gk3.desc();

可以看出,工廠方法模式特點:不僅僅做出來的產品要抽象, 工廠也應該需要抽象。

工廠方法使一個產品類的實例化延遲到其具體工廠子類.

工廠方法的好處就是更擁抱變化。當需求變化,只需要增刪相應的類,不需要修改已有的類。
缺點:
引入工廠方法模式後,每次新增一個具體產品類,也要同時新增一個具體工廠類


抽象工廠模式

以上介紹的工廠都是單產品系的。抽象工廠是多產品系
這裏一個工廠不僅生產麪條,同時它也生產飲料

飲料類

public abstract class Drinks {
    /**
     * 描述每種飲料多少錢
     */
    public abstract void prices();
}

可樂:

public class ColaDrinks extends Drinks {
    @Override
    public void prices() {
        System.out.println("可樂3塊");
    }
}

果汁:

public class JuiceDrinks extends Drinks {
    @Override
    public void prices() {
        System.out.println("果汁4塊");
    }
}

抽象工廠類

public abstract class AbstractFoodFactory {
    /**
     * 生產麪條
     */
    public abstract Noodles createNoodles();

    /**
     * 生產飲料
     */
    public abstract Drinks createDrinks();
}

統一工廠(具體工廠類):

public class TYlmFoodFactory extends AbstractFoodFactory {
    @Override
    public Noodles createNoodles() {
        return new LzNoodles();//蘭州拉麪
    }

    @Override
    public Drinks createDrinks() {
        return new JuiceDrinks();//賣果汁
    }
}

康師傅工廠(具體工廠類):

public class KSFFoodFactory extends AbstractFoodFactory {
    @Override
    public Noodles createNoodles() {
        return new PaoNoodles();//泡麪
    }

    @Override
    public Drinks createDrinks() {
        return new ColaDrinks();//賣可樂
    }
}

使用

AbstractFoodFactory abstractFoodFactory1 = new TYFoodFactory();
abstractFoodFactory1.createDrinks().prices();
abstractFoodFactory1.createNoodles().desc();

abstractFoodFactory1= new KSFFoodFactory();
abstractFoodFactory1.createDrinks().prices();
abstractFoodFactory1.createNoodles().desc();

輸出

果汁4塊
蘭州拉麪
可樂3塊
泡麪

總結

工廠模式:方便創建 同種產品類型的 複雜參數 對象
工廠模式重點就是適用於 構建同產品類型(同一個接口 基類)的不同對象時,這些對象new很複雜,需要很多的參數,而這些參數中大部分都是固定的,所以便用工廠模式封裝。
(如果構建某個對象很複雜,需要很多參數,但這些參數大部分都是“不固定”的,應該使用Builder模式)


參考
java 三種工廠模式
設計模式(一) 工廠模式 五種寫法總結

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