ホームページ >Java >&#&チュートリアル >ファクトリーパターン設計パターンの導入と活用
シンプルファクトリパターン
シンプルファクトリパターンはクラス作成パターンで、静的ファクトリメソッドパターンとも呼ばれます。単純なファクトリ パターンでは、ファクトリ オブジェクトを使用して、どの製品クラス インスタンスを生成するかを決定します。
シンプルなファクトリーパターンを使用する理由
理由は簡単です: デカップリングです。
LOL シーン分析:
LOL には現在 100 人を超えるヒーローがいます。各キャラクターのスキルはすべて異なり、特定のヒーローのコード実装も異なるはずです。 Q、W、4 つの基本スキル E と R、およびサマナー スキル 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("闪现"); } }
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; } }
利点これは、コードの記述量がはるかに少ないだけでなく、サモナーのスキルが追加されることを前提として、ファクトリーコードを変更する必要がなく、開閉の原則が守られるためです。
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 とリフレクションを使用したことがありますが、これらの方法に加えて、特定の製品の ID を渡してデータベース ベースでクエリを実行するなど、製品を作成する他の方法もあります。この識別に関して。
ファクトリーモデルの長所と短所
利点:
1. ソフトウェアアーキテクチャを単純に最適化し、各機能モジュールの責任と権利を明確にする2. ファクトリクラスを通じて、外部の世界は次のことを行います。特定の製品を直接作成する必要がない オブジェクトは消費のみを担当する必要があり、内部でオブジェクトを作成する方法を考慮する必要はありません 短所:1. 改善前の単純なファクトリ パターンの作成ロジックはすべて に集中しています。新しいクラスを追加する必要がある場合は、ファクトリ クラスを変更する必要があります。 2. 特定の製品の数が増えるにつれて、この種の条件判定は、特定の製品タイプの判定と絡み合うため、機能モジュールの分散を避けることが困難になり、機能モジュールの分散に悪影響を及ぼします。システムのメンテナンスと拡張3. 改良されたシンプルファクトリーモードは主にリフレクションを使用するため、効率が低くなります以上がファクトリーパターン設計パターンの導入と活用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。