設計模式 —— 工廠模式
工廠模式(Factory Pattern)專門負責將大量有共同介面的類例項化。工廠模式可以動態決定將哪一個類例項化,不必事先知道每次要例項化哪一個類。
簡單工廠模式
簡單工廠模式(Simple Factory Pattern):又稱為 靜態工廠方法 (Static Factory Method)模式,它屬於類建立型模式。在簡單工廠模式中,可以根據引數的不同返回不同類的例項。簡單工廠模式專門定義一個類來負責建立其他類的例項,被建立的例項通常都具有共同的父類。簡單工廠並不屬於23種設計模式。
例項
肥宅喜愛的各種快樂水(意指本人) 快樂水(產品介面)
public interface Kls { String name(); } 複製程式碼
肥宅快樂水-可樂(具體產品)
public class Coke implements Kls { @Override public String name() { return "肥宅快樂水-可樂"; } } 複製程式碼
快樂水-雪碧(具體產品)
public class Sprite implements Kls { @Override public String name() { return "快樂水-雪碧"; } } 複製程式碼
快樂水工廠(工廠類)
public class KlsFactory { public static Kls getFzs(String type) throws Exception { Kls fzs = null; if ("coke".equalsIgnoreCase(type)) { fzs = new Coke(); } else if ("sprite".equalsIgnoreCase(type)) { fzs = new Sprite(); } if (Objects.isNull(fzs)) { throw new RuntimeException("沒找到快樂水~"); } return fzs; } } 複製程式碼
肥宅(客戶)
public class Fz { @Test public void drink() throws Exception { // 製造可樂 Kls coke = KlsFactory.getFzs("coke"); System.out.println("肥宅開始喝:" + coke.name()); // 製造雪碧 Kls sprite = KlsFactory.getFzs("sprite"); System.out.println("肥宅開始喝:" + sprite.name()); } } 複製程式碼
UML類圖

優點:
-
隱藏了具體實現:像
Coke
和Sprite
,這樣的產品,客戶端是不需要知道具體實現的,只需知道怎麼用; -
客戶端只需直接使用物件就好,不需關心物件是怎麼
new
出來的; -
接耦:客戶端沒有
new xxx
這樣的硬編碼,後期設計者改變框架,各種類(除了工廠類)都有改變,只要工廠類的名字、方法名字沒變,客戶端的程式碼,一行都不要動。
缺點:
- 擴充套件麻煩,需要改動現有程式碼。如果想要增加一個新的產品類,就需要改動工廠類程式碼。
- 所有邏輯全放在工廠類,產品一多將變得異常難閱讀,一旦出錯,就全GG了。
工廠方法模式
工廠方法模式(Factory Method)是簡單工廠的僅一步深化, 在工廠方法模式中,我們不再提供一個統一的工廠類來建立所有的物件,而是針對不同的物件提供不同的工廠。也就是說每個物件都有一個與之對應的工廠。
例項
接著上面快樂水的例子。將 快樂水工廠 ( KlsFactory
) 抽象出共有方法,再分別實現具體的快樂水生產工廠。
快樂水總工廠
public interface Factory { /** * 製造快樂水 * * @return Kls */ Kls create(); } 複製程式碼
可樂工廠
public class CokeFactory implements Factory { @Override public Kls create() { return new Coke(); } } 複製程式碼
雪碧工廠
public class SpriteFactory implements Factory { @Override public Kls create() { return new Sprite(); } } 複製程式碼
肥宅
public class Fz { @Test public void drink() throws Exception { // 製造可樂 CokeFactory cokeFactory = new CokeFactory(); Kls coke = cokeFactory.create(); System.out.println("肥宅開始喝:" + coke.name()); // 製造雪碧 SpriteFactory spriteFactory = new SpriteFactory(); Kls sprite = spriteFactory.create(); System.out.println("肥宅開始喝:" + sprite.name()); } } 複製程式碼
擴充套件芬達快樂水 芬達快樂水
public class Fanta implements Kls { @Override public String name() { return "快樂水-芬達"; } } 複製程式碼
芬達工廠
public class FantaFactory implements Factory { @Override public Kls create() { return new Fanta(); } } 複製程式碼
肥宅新增
FantaFactory fantaFactory = new FantaFactory(); Kls fanta = fantaFactory.create(); System.out.println("肥宅開始喝:" + fanta.name()); 複製程式碼
UML類圖

優點:
- 簡單工廠模式 的有點全部保留;
- 新增產品,不需要改動現有的程式碼,只需實現對應的
產品類
、工廠實現類
。
缺點:
-
增加系統負擔;
-
當新增產品較多時,會導致程式碼量劇增;
-
一個工廠只能生產一個產品。