工廠模式是使用頻率很高的一種設計模式,在面試中也常常問到,今天咱們就來學習它。面試
解答這個問題前,咱們先來了解什麼是工廠模式。設計模式
工廠模式其實也稱建立模式,是用於建立對象的一種方式。本質上就是用工廠方法來代替new實例化對象。bash
舉個例子:咱們在編寫代碼的時候,在一個A類中經過new的方式實例化了類B,那麼A類和B類之間就存在耦合,若是之後修改了B類的代碼和使用方式,例如須要在構造函數中傳入參數,那麼A類也就須要跟着修改了,一個類的依賴可能影響不大,但如有多個類依賴了B類,那麼這個工做量將會至關的大,這無疑是件很是痛苦的事。這種狀況下,咱們須要把建立實例的工做單獨分離,與調用方解耦,也就是使用工廠方法建立實例的工做封裝起來。這樣咱們在須要調用對象的時候就不須要關心那些複雜的實例化問題。框架
工廠模式可分爲兩類:簡單工廠模式和工廠模式。函數
定義一個接口和實現類,創建一個工廠類這些實現類進行實例的建立。學習
咱們用球來舉例,定義一個基本的接口Ball,和一個抽象方法Play (玩),測試
public interface Ball {
void play();
}
複製代碼
建立一個籃球的類和一個足球的類,並實現該接口,ui
public class BasketBall implements Ball {
public void play() {
System.out.println("打籃球~~~");
}
}
複製代碼
public class FootBall implements Ball {
public void play() {
System.out.println("踢足球~~~");
}
}
複製代碼
而後,建立一個工廠類,能夠用於生產籃球或者足球,spa
public class BallFactory {
public Ball produce(String type) {
if ("basketball".equals(type)) {
return new BasketBall();
} else if ("football".equals(type)) {
return new FootBall();
}
return null;
}
}
複製代碼
工廠類建好之後,咱們就能夠實例化工廠類,並調用 produce 方法來建立對應的實例對象,設計
public static void main(String[] args) {
BallFactory factory = new BallFactory();
Ball ball = factory.produce("basketball");
ball.play();
}
複製代碼
結果輸出:打籃球~~~
這就是簡單工廠模式的基本實現,用關係圖來表示就是:
這種模式的優勢是代碼簡單,可以根據具體的參數返回對應的實例對象。固然缺點也很明顯,就是工廠類集中了全部實例的建立邏輯,若是增長業務就要多出相應的工廠方法,不只代碼可能變得臃腫,也容易違反GRASPR的高內聚的責任分配原則
又稱多態性工廠模式,是對簡單工廠模式的改進。工廠模式中,一個子類對應一個工廠類,這些工廠類都實現了一個工廠接口。這至關於把一個簡單工廠類拆分紅多個工廠,這樣代碼就不會都耦合在同一個類裏了。
具體的產品接口和實現類仍是複用上面的代碼,咱們只需關注工廠方法的邏輯便可,
先建立一個工廠的接口
public interface IFactory {
void produce();
}
複製代碼
而後建立對應業務的工廠類
public class BasketFactory implements IFactory {
public Ball produce() {
return new BasketBall();
}
}
複製代碼
public class FootFactory implements IFactory {
public Ball produce() {
return new FootBall();
}
}
複製代碼
測試代碼
public static void main(String[] args) {
BasketFactory basketFactory = new BasketFactory();
Ball basket = basketFactory.produce();
FootFactory footFactory = new FootFactory();
Ball foot = footFactory.produce();
basket.play();
foot.play();
}
複製代碼
輸出結果是:
打籃球~~~
踢足球~~
複製代碼
如上所示,若是須要添加新的產品,如排球,咱們就多寫一個工廠類便可,這樣就不會把全部的業務都耦合到一個工廠類中了,用關係圖表示以下:
最後,總結一下工廠模式的優勢吧,一、良好的封裝性,代碼結構清晰,調用者只需知道產品的類名便可,不須要知道建立對象的過程,下降代碼間的耦合。
二、擴展性優秀,若是增長一個產品類,只需增長一個對應的工廠類。
三、屏蔽產品類。產品類的實現如何變化,調用者都不須要關心,只需關心產品的接口,只要接口保持不變,系統中的上層模塊就不會發生變化。
四、工廠模式是典型的解耦框架,高層模塊只須要知道產品的抽象類,其餘的實現類都不須要關心,符合迪米特法則,符合依賴倒置原則,符合里氏替換原則。
參考:
《設計模式之禪》