上一節我們已經學習了原型模式,稍微複習一下:通過重寫Object 類的clone()
方法實現淺克隆,淺克隆也要實現Cloneable
標記介面。而深克隆則是將物件通過序列化和反序列化
的方式進行建立和還原。
本小結將學習的是工廠模式,這個模式在平時是特別常用的,還需好好理解。我也將舉一些例子?給大家
、
從生活出發
假設我們今天不想做飯,想出去吃飯、肯定選定一家好吃的川菜館
,然後我們找好位置坐下,給廚師
說,我想吃糖醋排骨
。 稍微等待幾分鐘、菜就可以做好,然後給你呈上來。
這是一個很經典的例子,我們平時也經常有這樣的實際問題,你發現了麼?
- 我只需要告訴廚師
菜名
,我要吃啥就行了 - 我不關注這個菜是怎麼
生產的 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();
--------
紅燒排骨
理解工廠模式
通過這個簡單的例子,我們可以學習到:
- 無需關注物件是如何建立的。只需通過指定的
關鍵字
就能拿到我需要的產品,這就是簡單工廠模式。
抽象工廠
抽象工廠,就是簡單工廠的抽象版、如何理解呢?我們上面的工廠(廚房)它已經是一個確定的物件
了。而抽象工廠,則是在廚房
的基礎上,再次衍生出一個介面,我們的廚房
則是這個抽象類的一個具體例項化。
程式碼源於生活
我又要開始舉栗子?了。請細細品
我們都知道小米
小米既可以生產手機
也可以生產電器用品
那麼這就是一個很好的例子。
小米抽象工廠
是一個巨大的工廠,它裡面有小米手機工廠
以及小米電器工廠
而不同的工廠,則生產不同的產品
。
程式碼教學開始
首先,我們得需要一個抽象工廠,這個工廠可以包含手機工廠和電器工廠。
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