設計模式之 - 簡單工廠模式
一、什麼是簡單工廠模式
簡單工廠模式(Simple Factory Pattern):又稱為靜態工廠方法(Static Factory Method)模式,它屬於類建立型模式。在簡單工廠模式中,一個抽象的產品類,可以派生出多個具體的產品類,它們都具有共同的父類。
我們再來看下簡單工廠模式的UML圖:
二、簡單工廠模式的構成
-
工廠類:工廠類是我們的核心類,它負責建立所有例項的內部邏輯,工廠類可以直接被呼叫建立我們的產品例項。
-
抽象產品類:簡單工廠模式所建立的所有物件的父類,它負責描述所有例項所擁有的公共介面。
-
具體產品類:簡單工廠所建立的具體的例項物件。
三、例項演示
我們做這個一個分析,有一家造車廠它裡面可以造車的各個零件,在這個廠裡,有專門造輪胎的車間,有專門造發動機的車間還有換門造車玻璃的車間,那麼我們想一下,這些車間是不是都是歸屬於這個造車廠的,每個車間是不是都有自己的職能。
假設我們現在組裝車間要組裝一輛車,他們需要發動機、輪胎、玻璃等部件,那麼作為組裝車的人,他們根本不關心你怎麼做,他們只關心這個東西做沒做好,做好了趕緊遞過來,我這邊要用。
我們先來建立一個造車廠的類:
public interface CarFactory { void ability(); }
我們既然有了造車廠,那麼我們地下的車間部門只需要實現這個類,去完成各自的職能就可以了
玻璃車間:
public class Glass implements CarFactory{
@Override
public void ability() {
System.out.println("玻璃已經生產好了");
}
}
發動機車間:
public class Engine implements CarFactory { @Override public void ability() { System.out.println("發動機製造好了"); } }
輪胎車間:
public class AutoTyre implements CarFactory{
@Override
public void ability() {
System.out.println("輪胎已經生產好了");
}
}
既然已經有個產品類和具體的產品,那麼接下來我們是不是要做一個工廠去進行生產啊,工廠類是整個模式的關鍵,它需要進行必要的邏輯判斷,根據消費者給的資訊,它需要決定來建立哪個物件的例項,消費者不再關心如何建立具體的產品,他只需要負責好需要生產的產品就行了。
public class Product {
public static CarFactory product(String skill) {
CarFactory carFactory = null;
switch (skill) {
// 製造輪胎
case "autoTyre":
carFactory = new AutoTyre();
break;
// 製造發動機
case "engine":
carFactory = new Engine();
break;
// 製造玻璃
case "glass":
carFactory = new Glass();
}
return carFactory;
}
}
在這裡我們可以發現,所有類都有一個共同的父類,到這裡大家應該可以發現,我們平時所說的封裝、繼承、多型在這裡是不是已經體現出來了(這裡面我沒用繼承,是因為Java是單繼承的,所以我這裡改為了介面實現的方式,因為Java是可以多實現的,這樣有利於我們程式的擴充套件)。
接下里,我們來看下組裝車間是怎麼來索要所需的部件的
public class CarMain {
public static void main(String[] args) {
// 生產一個發動機
CarFactory engine = Product.product("engine");
engine.ability();
// 生產一個玻璃
CarFactory glass = Product.product("glass");
glass.ability();
// 生產一個輪胎
CarFactory autoTyre = Product.product("autoTyre");
autoTyre.ability();
}
}
我們先來看下結果:
如果我們想要再去生產其他的一些部件,我們只需要去實現造車廠的類,完成自己特定的職能就可以了,也不會去跟其他的車間有任何的交集,我們只需要完成我們的需要做的東西就好。
四、模式優點
-
首先程式實現瞭解耦和,大大降低的程式之間的耦合性,我們增加車間不會影響到其他的車間進度;
-
提高了程式的擴充套件性,如果我們想要增加一個車間,那麼只需要實現造車廠類,完成自己的職能就好;
-
組裝車間可以免除直接建立物件的責任,他不需要自己直接去建立,而是通過我們專門的工廠類來建立,他只需要告訴我們他需要什麼東西;
五、簡單工廠模式的缺點
-
首先大家應該可以明顯的發現,如果我們每增加一個產品,那相應的我們就要增加一個子工廠,這樣額外的加大了我們的開發量;
-
由於工廠類集中了所有例項的建立邏輯,違反了高類聚責任分配原則;
六、使用場景
-
工廠類建立的物件比較少;
-
消費者只需要傳進工廠類的引數,對於如何建立物件不關心;