軟件設計模式學習(四)簡單工廠模式

簡單工廠模式

簡單工廠模式是最簡單的設計模式之一,雖然不屬於二十三種設計模式,但應用也較爲頻繁。學習它也是學習其他創建型模式的基礎



模式定義

在實際軟件開發中,有時需創建一些來自於相同父類的類的實例,爲此可以專門定義一個類來負責創建這些類的實例,這些被創建的實例具有共同的父類。習慣上將獲得其他類實例的方法定義爲static方法,外部不需要實例化這個類就可以直接調用該方法獲得對象,該方法也稱爲靜態工廠方法。

簡單工廠模式又稱爲靜態工廠方法模式,根據參數的不同返回不同的類型的實例。簡單工廠模式專門定義一個類來負責創建其他類的實例,被創建的實例通常具有共同的父類。


簡單工廠模式實例之手機工廠

  1. 實例說明

    某手機廠專爲各手機品牌生產手機,調用工廠的方法時傳入參數,則根據傳入的不同參數返回不同品牌的手機。

  2. 實例類圖

在這裏插入圖片描述

  1. 實例代碼及解釋

    1. 抽象產品類Phone

      public abstract class Phone {
      
          public abstract void use();
      }
      
    2. 具體產品類HuaweiPhone

      public class HuaweiPhone extends Phone {
          @Override
          public void use() {
              System.out.println("華爲手機使用中....");
          }
      }
      
    3. 具體產品類XiaomiPhone

      public class XiaomiPhone extends Phone {
      
          @Override
          public void use() {
              System.out.println("小米手機使用中....");
          }
      }
      
    4. 工廠類PhoneFactory

      public class PhoneFactory {
      
          public static Phone producePhone(String brand) {
      
              if(brand.equalsIgnoreCase("huawei")) {
                  System.out.println("生產華爲手機...");
                  return new HuaweiPhone();
              } else if (brand.equalsIgnoreCase("xiaomi")) {
                  System.out.println("生產小米手機");
                  return new XiaomiPhone();
              } else {
                  System.out.println("暫無該手機生產....");
                  return null;
              }
          }
      }
      
    5. 配置文件

      <?xml version="1.0" encoding="UTF-8" ?>
      <configuration>
          <!--
              通過從XML配置文件讀取節點獲取數據
           -->
          <brandName>huawei</brandName>
      </configuration>
      
    6. XML操作工具類

      public class XMLUtilPhone {
      
          public static String getBrandName() throws Exception {
      
              //創建解析器工廠
              DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
              //創建解析器
              DocumentBuilder builder = builderFactory.newDocumentBuilder();
              //得到document
              Document document = builder.parse("configPhone.xml");
              //獲取包含品牌名稱的文本節點
              NodeList brandNameList = document.getElementsByTagName("brandName");
              Node classNode = brandNameList.item(0).getFirstChild();
              String brandName = classNode.getNodeValue().trim();
      
              return brandName;
          }
      }
      
    7. 測試類

      public class Test {
      
          public static void main(String[] args) throws Exception {
              String brandName = XMLUtilPhone.getBrandName();
              Phone phone = PhoneFactory.producePhone(brandName);
              phone.use();
          }
      }
      
    8. 結果分析

      如果在配置文件中將節點內容設置爲huawei,則輸出結果爲:
      在這裏插入圖片描述
      如果設置爲vivo,則輸出結果爲:
      在這裏插入圖片描述

      如果希望系統支持生產vivo牌手機,則需要添加一個新的具體類VivoPhone,同時還需要修改工廠中的方法。因此簡單工廠模式最大的問題在於工廠類的職責過於沉重,並且修改工廠類邏輯判斷這一點是與開閉原則相違背的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章