簡單工廠模式
簡單工廠模式是類別的建立模式,又叫做靜態工廠方法模式。簡單工廠模式由一個工廠物件決定要生產哪一種產品類別的實例。
為什麼要用簡單工廠模式
#原因很簡單:解耦。
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";//虚弱 }
召喚師技能介面
<span style="color: #0000ff">public</span> <span style="color: #0000ff">interface</span><span style="color: #000000"> SummonerSkill { </span><span style="color: #0000ff">void</span><span style="color: #000000"> release();//释放技能 }<br></span>
召喚師技能實作類別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、改進後的簡單工廠模式主要是使用反射效率會低一些
以上是設計模式之工廠模式的簡介與使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!