JAVA設計模式 3【建立型】理解工廠模式與抽象工廠模式

程式猿小碼發表於2020-06-25

上一節我們已經學習了原型模式,稍微複習一下:通過重寫Object 類的clone() 方法實現淺克隆,淺克隆也要實現Cloneable 標記介面。而深克隆則是將物件通過序列化和反序列化 的方式進行建立和還原。

本小結將學習的是工廠模式,這個模式在平時是特別常用的,還需好好理解。我也將舉一些例子?給大家
image.png

從生活出發

假設我們今天不想做飯,想出去吃飯、肯定選定一家好吃的川菜館,然後我們找好位置坐下,給廚師說,我想吃糖醋排骨。 稍微等待幾分鐘、菜就可以做好,然後給你呈上來。

這是一個很經典的例子,我們平時也經常有這樣的實際問題,你發現了麼?

  • 我只需要告訴廚師菜名,我要吃啥就行了
  • 我不關注這個菜是怎麼生產的 new()

開始擼程式碼

/**
 * 抽象產品 菜
 */
public interface FoodProduct {
    void show();
}
------------
/**
 * 具體產品
 */
public class HongShao implements FoodProduct {
    @Override
    public void show() {
        System.out.println("紅燒排骨");
    }
}
------------
public class TangCu implements FoodProduct {
    @Override
    public void show() {
        System.out.println("糖醋魚");
    }
}

建立廚房工廠

建立一個廚房類,廚房可以用來生產食物產品,我們只需要告訴廚房,這裡是通過id 編號的形式告訴廚房的。我們只需要告訴廚房所需要的食物 而不關心這個食物產品是如何建立出來的。

public class KitchenFactory {
    /**
     * id=1 上菜紅燒肉 id=2 糖醋魚
     * @param id
     */
    public FoodProduct cooking(int id) {
        if (1 == id) {
            return new HongShao();
        } else {
            return new TangCu();
        }
    }
}
KitchenFactory kitchen = new KitchenFactory();
FoodProduct food = kitchen.cooking(1);
food.show();
--------
紅燒排骨

理解工廠模式

通過這個簡單的例子,我們可以學習到:

  • 無需關注物件是如何建立的。只需通過指定的關鍵字 就能拿到我需要的產品,這就是簡單工廠模式。

抽象工廠

image.png

http://c.biancheng.net/view/1351.html

抽象工廠,就是簡單工廠的抽象版、如何理解呢?我們上面的工廠(廚房)它已經是一個確定的物件 了。而抽象工廠,則是在廚房 的基礎上,再次衍生出一個介面,我們的廚房 則是這個抽象類的一個具體例項化。

程式碼源於生活

我又要開始舉栗子?了。請細細品

我們都知道小米 小米既可以生產手機 也可以生產電器用品 那麼這就是一個很好的例子。

小米抽象工廠 是一個巨大的工廠,它裡面有小米手機工廠 以及小米電器工廠 而不同的工廠,則生產不同的產品

程式碼教學開始

首先,我們得需要一個抽象工廠,這個工廠可以包含手機工廠和電器工廠。

public interface AbstractFactory {
    /**
     * 建立手機工廠
     * @return
     */
    PhoneFactory phoneFactory();
    /**
     * 建立電器工廠
     * @return
     */
    ElectricalFactory electricalFactory();
}

當然,手機工廠不知道是具體哪個工廠,反正它可以做一些事情,比如建立手機。

public interface PhoneFactory {
    /**
     * 手機工廠可以做的事情
     */
    void show();
}
-----------
public interface ElectricalFactory {
    /**
     * 電器工廠可以生產電器
     */
    void show();
}

上手實際建立一個小米工廠


public class XiaoMiFactory implements AbstractFactory {
    
    @Override
    public PhoneFactory phoneFactory() {
        return new XiaoMiPhoneFactory();
    }
    @Override
    public ElectricalFactory electricalFactory() {
        return new XiaoMiElectricalFactory();
    }
}
-------------
public class XiaoMiElectricalFactory implements ElectricalFactory {
    @Override
    public void show() {
        System.out.println("小米電器工廠可以生產電器。。比如小米掃地機器人");
    }
}
-------------
public class XiaoMiPhoneFactory implements PhoneFactory {
    @Override
    public void show() {
        System.out.println("小米手機工廠可以生產小米手機。。。");
    }
}

當然,小米工廠實現抽象工廠,那小米工廠就必須要包含兩個子工廠,手機工廠和電器工廠了。我們也可以建立一個華為工廠,其實是一樣的道理。

AbstractFactory factory = new XiaoMiFactory();

PhoneFactory phoneFactory = factory.phoneFactory();
phoneFactory.show();
--------
小米手機工廠可以生產小米手機。。。

我們從建立的小米工廠中拿出小米手機工廠 然後再執行手機工廠可以做事情,抽象工廠,就是在上面的簡單工廠的層次上進行了再次的抽象,將具體的工廠進行抽象。

假設我們按照上面的邏輯。對於一個工廠,我想要一部手機 我給工廠說一聲就行了。我不關心這個手機 是如何生產出來的。我該怎麼操作?

我稍微將之前的幾個介面作為稍微的改造。

public interface PhoneFactory {
    /**
     * 手機工廠可以做的事情
     */
    PhoneProduct show();
}
---------------
public class XiaoMiPhoneFactory implements PhoneFactory {
    @Override
    public PhoneProduct show() {
        return new PhoneProduct(1, "小米10 Pro");
    }
}
----------
//手機物件
public class PhoneProduct {

    private int id;

    private String name;
}

我們可以建立這樣一個訪問器,通過訪問器物件,將我們需要的物件名稱傳入就好比下單 它能自動匹配工廠,並且呼叫工廠建立產品 的方法,將我們需要的產品進行建立。

public class AbstractFactoryClient {

    public PhoneProduct createPhone(String name) {

        AbstractFactory factory = null;

        if ("xiaomi" == name) {
            factory = new XiaoMiFactory();
        } else {
            factory = new HuaweiFactory();
        }
        PhoneFactory phoneFactory = factory.phoneFactory();
        
        return phoneFactory.show();
    }
}

測試一下

AbstractFactoryClient factoryClient = new AbstractFactoryClient();
PhoneProduct product = factoryClient.createPhone("xiaomi");
System.out.println(product);
-----------
手機銘牌 編號:1,型號:小米10 Pro

小結

學習完本節,是否對於工廠模式和抽象工廠有了一個深入的瞭解呢?工廠模式其實在平時的程式碼中,還是比較常用的。所以還是需要更加努力學習和使用!

程式碼示例

https://gitee.com/mrc1999/Dev-Examples

參考

http://c.biancheng.net/view/1351.html

歡迎關注

banner

相關文章