ホームページ >Java >&#&チュートリアル >ファクトリーパターン設計パターンの導入と活用

ファクトリーパターン設計パターンの導入と活用

零下一度
零下一度オリジナル
2017-07-03 11:31:181694ブラウズ

シンプルファクトリパターン

シンプルファクトリパターンはクラス作成パターンで、静的ファクトリメソッドパターンとも呼ばれます。単純なファクトリ パターンでは、ファクトリ オブジェクトを使用して、どの製品クラス インスタンスを生成するかを決定します。

シンプルなファクトリーパターンを使用する理由

理由は簡単です: デカップリングです。

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("闪现");
  }
  
}
サモナースキル実装カテゴリ 2: Ignite

public class IgniteSS implements SummonerSkill {  public static final String NAME = "引燃";

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

}
Summoner Skill Factory

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 人以上のヒーローが使用する場合を想像してください。そうでなければ、画像はとても美しいです~

利点これは、コードの記述量がはるかに少ないだけでなく、サモナーのスキルが追加されることを前提として、ファクトリーコードを変更する必要がなく、開閉の原則が守られるためです。

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。