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