初識設計模式1:簡單工廠模式

来源:http://www.cnblogs.com/hooray2010/archive/2017/07/02/7106678.html
-Advertisement-
Play Games

簡單工廠模式 簡單工廠模式是類的創建模式,又叫做靜態工廠方法模式。簡單工廠模式由一個工廠對象決定生產出哪一種產品類的實例。 為什麼要使用簡單工廠模式 原因很簡單:解耦。 LOL場景分析: LOL中目前有100多個英雄,各個人物的技能全都不同,具體英雄的代碼實現必定不同; 但是每個英雄的技能都是Q、W ...


簡單工廠模式

簡單工廠模式是類的創建模式,又叫做靜態工廠方法模式。簡單工廠模式由一個工廠對象決定生產出哪一種產品類的實例。

 

為什麼要使用簡單工廠模式

原因很簡單:解耦。

 

LOL場景分析:

LOL中目前有100多個英雄,各個人物的技能全都不同,具體英雄的代碼實現必定不同;

但是每個英雄的技能都是Q、W、E、R這4個基本技能,以及召喚師技能D、F;

雖然選擇的英雄不同,但游戲的其他部分應該是完全相同的,不可能根據我們選擇的英雄不同,而完全改變其他通用部分的邏輯!

 

如何實現這樣的應用場景

召喚師技能常量類

public class SummonerSkillName {
  
  public static final String FLASH = "Flash";//閃現
  public static final String HEAL = "Heal";//治療
  public static final String IGNITE = "Ignite";//引燃
  public static final String REVIVE = "Revive";//懲戒
  public static final String TELEPORT = "Teleport";//傳送
  public static final String EXHAUST = "ExhaustSS";//虛弱
  
}

召喚師技能介面

public interface SummonerSkill {
  
  void release();//釋放技能
  
}

召喚師技能實現類1:閃現

public class FlashSS implements SummonerSkill {
  
  public static final String NAME = "閃現";
  
  @Override
  public void release() {
    System.out.println("閃現");
  }
  
}

召喚師技能實現類2:引燃

public class IgniteSS implements SummonerSkill {

  public static final String NAME = "引燃";

  @Override
  public void releaseSS() {
    System.out.println("引燃");
  }

}

召喚師技能工廠

public class SummonerSkillFactory {
  
  public static SummonerSkill getSkillSS(String ssName) throws Exception {
    
    SummonerSkill ss;
    if (ssName.equals(SummonerSkillName.FLASH)) {
      ss = new FlashSS();
    } else if (ssName.equals(SummonerSkillName.TELEPORT)) {
      ss = new TeleportSS();
    } else if (ssName.equals(SummonerSkillName.HEAL)) {
      ss = new HealSS();
    } else if (ssName.equals(SummonerSkillName.IGNITE)) {
      ss = new IgniteSS();
    } else if (ssName.equals(SummonerSkillName.EXHAUST)) {
      ss = new ExhaustSS();
    } else {
      ss = new ReviveSS();
    }
    
    return ss;
  }
  
}

改進之後的工廠,使用反射:

public class SummonerSkillFactory {
  
  private static final String CLASS_NAME_SUFFIX = "SS";
  
  public static SummonerSkill getSkillSS(String ssName) throws Exception {

    String className = ssName + classNameSuffix;
    String packageName = SummonerSkill.class.getPackage().getName();
    SummonerSkill ss = (SummonerSkill) Class.forName(packageName + "." + className).newInstance();
    
    return ss;
  }
  
}

腦補一下如果100多個英雄也用 if else,畫面得有多美~

這樣的好處不僅在於代碼編寫量小很多,而且假定新增召喚師技能的話,工廠的代碼不需要更改,遵守了開閉原則。

public class LeagueClient {
  
  @Test
  public void selectHero() throws Exception {
    SummonerSkill flash = SummonerSkillFactory.getSkillSS(SummonerSkillName.FLASH);
    SummonerSkill ignite = SummonerSkillFactory.getSkillSS(SummonerSkillName.IGNITE); 
}

 

簡單工廠模式或者說工廠模式的關註點並不在於在工廠中是如何生產出來需要的類的,而在於將創建產品與消費產品分離

前面使用過if...else if...else、反射,除了這些方法,還可以有別的方法可以創建產品,比如傳入一個具體產品的標識,根據這個標識去資料庫裡面查詢。

 

工廠模式的優缺點

優點:

1、簡單優化了軟體體繫結構,明確了各自功能模塊的職責和權利

2、通過工廠類,外界不需要直接創建具體產品對象,只需要負責消費,不需要關心內部如何創建對象

缺點:

1、改進前的簡單工廠模式全部創建邏輯都集中在一個工廠類中,能創建的類只能是考慮到的,如果需要添加新的類,就必須改變工廠類了

2、改進前的簡單工廠模式隨著具體產品的不斷增多,可能會出現共產類根據不同條件創建不同實例的需求,這種對條件的判斷和對具體產品類型的判斷交錯在一起,很難避免功能模塊的蔓延,對系統的維護和擴展不利

3、改進後的簡單工廠模式主要是使用反射效率會低一些


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • C++相對於C語言而言支持函數重載是其極大的一個特點,相信在使用C語言的時候大家如果要寫一個實現兩個整型數據相加的函數還要寫一個浮點型數據相加的函數,那麼這兩個函數的名字絕對不可以一樣,這樣無疑在我們使用這個函數的時候增加了複雜性,但是在C++中我們卻可以很好的解決這個問題,因為在C++中函數是支持 ...
  • 需求:當進行文件長傳保存等操作時,能在頁面顯示一個帶百分比的進度條,給用戶一個好的交互體驗 實現步驟 JSP頁面 1.添加table標簽 這個table標簽要隱藏,進度條執行的時候再顯示。id為tdOne和tdTwo分別為進度條的藍色和灰色區域。 2.添加js代碼 當點擊保存時,執行loading( ...
  • 2、列表簡介 Python內置的一種數據類型是列表:list。 list是一種有序的集合。 列表由一系列按特定順序排列的元素組合。用 [ ] 來表示。 list裡面的元素的數據類型也可以不同,比如: >>> L = ['Apple', 123, True] 2.1索引列表 從0開始而不是1。當索引超 ...
  • 題目描述 香穗子在田野上調蘑菇!她跳啊跳,發現自己很無聊,於是她想了一個有趣的事情,每個格子最多只能經過1次,且每個格子都有其價值 跳的規則是這樣的,香穗子可以向上下左右四個方向跳到相鄰的格子,並且她只能往價值更高(這裡是嚴格的大於)的格子跳. 香穗子可以從任意的格子出發,在任意的格子結束, 那麼她 ...
  • 題目描述 和所有人一樣,奶牛喜歡變化。它們正在設想新造型的牧場。奶牛建築師Hei想建造圍有漂亮白色柵欄的三角形牧場。她擁有N(3≤N≤40)塊木板,每塊的長度Li(1≤Li≤40)都是整數,她想用所有的木板圍成一個三角形使得牧場面積最大。 請幫助Hei小姐構造這樣的牧場,並計算出這個最大牧場的面積。 ...
  • Netty 線程模型 Netty的線程模型主要是基於React,因為考慮到應用場景的不同所以演化出多種版本。 單線程模式 即接收服務請求以及執行IO操作都由一個線程來完成,由於採用的是IO多路復用這類無阻塞IO操作,所以在請求量不大的情況下單線程模式也是可以解決一部分場景問題的。 單接收多工作線程模 ...
  • 一、前言 今天在Ubuntu安裝了lnmp環境,運行項目的時候出現了,引入500的錯誤 二、查看錯誤 再項目文件入口添加,代碼顯示錯誤內容,查看到一下錯誤 三、分析錯誤內容 查看問題描述以及資料,發現是php open_basedir 配置的問題,php不能引入其授權目錄上級及其以上的文件,預設配置 ...
  • 上傳頭像,自己感覺了好久,就是上傳文件唄其實,存在一個路徑,資料庫存儲這個路徑,然後展示給前端,啥都不說,看怎麼實現的。 資料庫設置如下 form 表單設計: 後端實現代碼 存儲路徑是 接下來是前端的展示 這裡說明下,這裡的後端實現上傳的頭像的代碼 在Windows上回報錯,說文件不存在,我試著去修 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...