問題總結20-12-14至20-12-20
工廠模式的介紹
工廠模式(Factory Pattern)是 Java 中最常用的設計模式之一。這種型別的設計模式屬於建立型模式,它提供了一種建立物件的最佳方式。之前我們建立類物件時, 都是使用new 物件的形式建立, 除new 物件方式以外, 工廠模式也可以建立物件.
耦合度: 類與類之間的關係,如果關係比較強,高耦合, 如果關係比較弱,低耦合
10個類:
10個測試類: 每個測試類都要建立這10個類的物件
以前: 在10個測 過new 來建立 10個測試類和這10個類都要關係起來 這樣耦合度比較高,而開發是要低耦合
工廠模式: 定義一個工廠類,專門用來建立這10個類的物件, 並提供獲取的方法,那這個時候測試類只需要跟工廠類關聯 降低低耦合
主要解決:主要解決介面選擇的問題。
何時使用:我們明確地計劃不同條件下建立不同例項時。
如何解決:讓其子類實現工廠介面,返回的也是一個抽象的產品。
關鍵程式碼:建立過程在其子類執行。
應用例項:1、您需要一輛汽車,可以直接從工廠裡面提貨,而不用去管這輛汽車是怎麼做出來的,以及這個汽車裡面的具體實現。 2、Hibernate 換資料庫只需換方言和驅動就可以。
優點:1、一個呼叫者想建立一個物件,只要知道其名稱就可以了。 2、擴充套件性高,如果想增加一個產品,只要擴充套件一個工廠類就可以。 3、遮蔽產品的具體實現,呼叫者只關心產品的介面。
缺點:每次增加一個產品時,都需要增加一個具體類和物件實現工廠,使得系統中類的個數成倍增加,在一定程度上增加了系統的複雜度,同時也增加了系統具體類的依賴。這並不是什麼好事。
使用場景:1、日誌記錄器:記錄可能記錄到本地硬碟、系統事件、遠端伺服器等,使用者可以選擇記錄日誌到什麼地方。 2、資料庫訪問,當用戶不知道最後系統採用哪一類資料庫,以及資料庫可能有變化時。 3、設計一個連線伺服器的框架,需要三個協議,"POP3"、"IMAP"、"HTTP",可以把這三個作為產品類,共同實現一個介面。
注意事項:作為一種建立類模式,在任何需要生成複雜物件的地方,都可以使用工廠方法模式。有一點需要注意的地方就是複雜物件適合使用工廠模式,而簡單物件,特別是只需要通過 new 就可以完成建立的物件,無需使用工廠模式。如果使用工廠模式,就需要引入一個工廠類,會增加系統的複雜度。
工廠模式的作用
將前端程式碼與要建立的物件分開,前端不需要直接建立物件,也就不需要關心建立物件時需要的資料。只需要通過工廠獲取物件即可。
-
解決類與類之間的耦合問題
實現程式碼
1.編寫一個Car介面, 提供run方法
1 public interface Car {
2 public void run();
3 }
2.編寫一個Falali類實現Car介面,重寫run方法
1 public class FaLaLi implements Car {
2 @Override
3 public void run() {
4 System.out.println("法拉利正在以300邁的速度行駛...");
5 }
6 }
3.編寫一個Benchi類實現Car介面
1 public class BenChi implements Car {
2 @Override
3 public void run() {
4 System.out.println("賓士正在以200邁的速度行駛...");
5 }
6 }
4.提供一個CarFactory(汽車工廠),用於生產汽車物件
1 public class CarFactory {
2
3 // 提供一個建立汽車物件的方法
4 public static Car getInstance(String carName){
5 if ("FaLaLi".equalsIgnoreCase(carName)){
6 return new FaLaLi();
7 }else if ("BenChi".equalsIgnoreCase(carName)){
8 return new BenChi();
9 }else{
10 return null;
11 }
12 }
13
14 }
5.定義CarFactoryTest測試汽車工廠
1 public class Test1 {
2 public static void main(String[] args) {
3 // 以前:
4 FaLaLi f = new FaLaLi();
5 f.run();
6
7 BenChi b = new BenChi();
8 b.run();
9
10 System.out.println("==============================");
11
12 // 工廠類
13 Car car1 = CarFactory.getInstance("falali");
14 car1.run();
15
16 Car car2 = CarFactory.getInstance("benchi");
17 car2.run();
18 }
19 }