1. 程式人生 > >經典設計模式(三):抽象工廠模式

經典設計模式(三):抽象工廠模式

抽象工廠模式

本來不想寫這篇文章的,應該是不想寫工廠模式,因為基本大家都會,不過今天看到一個老鐵的部落格,https://www.yuxuan66.com/16 關於抽象模式的實現,寫得不錯,看了幾遍之後,有了點自己的想法,隨便再熟悉一下工廠模式,於是就有了這篇文章,主要是抽象工廠,引用下老鐵的例子:咖啡工廠做大做強,引入了新的飲品種類:茶、碳酸飲料。中國工廠僅能製作咖啡和茶,美國工廠僅能製作咖啡和碳酸飲料。

使用

我這裡建立一個抽象工廠,中國工廠和美國工廠繼承它。再建立一個飲料介面,實現各種飲料種類。再建立一個提供者,根據具工廠和種類提供對應的產品

建立一個抽象工廠

/**
 * @program:hope
 * @author:aodeng
 * @blog:低調小熊貓(https://aodeng.cc)
 * @微信公眾號:低調小熊貓
 * @create:2018-11-22 14:43
 * 抽象工廠
 **/
public abstract class AbstractDrinksFactory {
    /***
     *
     * @param whatYouLike 你喜歡的飲料型別:coffer,tea,sodas...
     * @return
     */
    public abstract Drink createDrink(String whatYouLike);
}

中國工廠和美國工廠繼承它

public class ChinaAbstractDrinksFactory extends AbstractDrinksFactory {
    @Override
    public Drink createDrink(String whatYouLike) {
        Drink drink=null;
        if ("coffer".equals(whatYouLike)){
            drink=new CofferDrink();
        }else if ("tea".equals(whatYouLike)){
            drink=new TeaDrink();
        }
        return drink;
    }
}
//
public class USAAbstractDrinksFactory extends AbstractDrinksFactory {
    @Override
    public Drink createDrink(String whatYouLike) {
        Drink drink=null;
        if ("coffer".equals(whatYouLike)){
            drink=new CofferDrink();
        }else if ("sodas".equals(whatYouLike)){
            drink=new SodasDrink();
        }
        return drink;
    }
}

再建立一個飲料介面

//飲料介面
public interface Drink {
    String getName();
}

實現各種飲料種類

//咖啡飲料
public class CofferDrink implements Drink {
    @Override
    public String getName() {
        return "coffer";
    }
}
//碳酸飲料
public class SodasDrink implements Drink {
    @Override
    public String getName() {
        return "sodas";
    }
}
 // 茶飲料
public class TeaDrink implements Drink {
    @Override
    public String getName() {
        return "tea";
    }
}

再建立一個提供者,更具工廠和種類提供對應的產品

 * 工廠提供者
 **/
public class DrinkStore {
    AbstractDrinksFactory abstractDrinksFactory;

    /***
     * 動態的選擇工廠
     * @param abstractDrinksFactory
     */
    public DrinkStore(AbstractDrinksFactory abstractDrinksFactory){
        this.abstractDrinksFactory=abstractDrinksFactory;
    }

    /***
     * 根據產品型別生產
     * @param whatYouLike
     * @return
     */
    public Drink createDrink(String whatYouLike){
        return abstractDrinksFactory.createDrink(whatYouLike);
    }
}

Main方法測試

/**
 * @program:hope
 * @author:aodeng
 * @blog:低調小熊貓(https://aodeng.cc)
 * @微信公眾號:低調小熊貓
 * @create:2018-11-22 15:07
 **/
public class Main {
    public static void main(String[] args) {
        //使用工廠提供類選擇工廠
        DrinkStore store=new DrinkStore(new ChinaAbstractDrinksFactory());
        //根據產品生產飲料
        Drink drink=store.createDrink("tea");
        //得到具體工廠的具體飲料
        System.out.println(drink.getName());//輸出tea
    }
}

以上就是整個抽象工廠了,不是很細(主要是懶得介紹了),自己感悟吧:),都是這樣學習的:)
簡單說一下:
簡單工廠和抽象工廠有些區別,除了結構上的區別,主要區別在於使用場景不同。

簡單工廠用於建立單一產品,將所有子類的建立過程集中在一個工廠中,如要修改,只需修改一個工廠即可。簡單工廠經常和單例模式一起使用,例如用簡單工廠建立快取物件(檔案快取),某天需要改用redis快取,修改工廠即可。
抽象工廠常用於建立一整個產品族,而不是單一產品。通過選擇不同的工廠來達到目的,其優勢在於可以通過替換工廠而快速替換整個產品族。例如上面的例子美國工廠生產美國drink,中國工廠生產中國drink。
優點
客戶端與具體要建立的產品解耦,擴充套件性和靈活性高

缺點
增加要建立的物件時,需要增加的程式碼較多,會使系統變得較為複雜

原始碼

https://github.com/java-aodeng/hope

我的部落格:https://aodeng.cc 我的公眾號:低調小熊貓 我的QQ群:756796932