【C#】ゲームで学ぶデザインパターン~AbstractFactory~

AbstractFactoryとは

AbstractFactoryは関連するオブジェクトをまとめて生成しようという考えのデザインパターンです。

今回はメインの武器とサブの武器を装備する必要があるゲーム(シューティングゲームなど)を例に解説していきます。

AbstractFactoryを使わない場合

//武器クラス
 class MainWeaponBase{・・・}
 class MainWeapon1:MainWeaponBase{・・・}
 class MainWeapon2:MainWeaponBase{・・・}
 class SubWeaponBase{・・・}
 class SubWeapon1:SubWeaponBase{・・・}
 class SubWeapon2:SubWeaponBase{・・・}
 
 //プレイヤー
 class Player
 {
 	private MainWeapon m_main;
 	private SubWeapon m_sub;
 	
 	public void SetWeapon(MainWeapon mwp, SubWeapon swp)
 	{
 		m_main = mwp;
 		m_sub = swp;
 	}
 }
 
 class GameFlow
  {
      Player m_player1;
      Player m_player2;
      public void Start()
      {
          m_player1.SetWeapon(new MainWeapon1(), new SubWeapon1());
          m_player2.SetWeapon(new MainWeapon2(), new SubWeapon2());
      }
  }

外側で武器を選んでプレイヤーに持たせるようにしています。

自由に武器を持たせる事ができるので現状でも全然悪くないのですが、キャラによって使える武器が固定の場合があります。

そういう場合は外部は何を設定しないといけないかを考えなくてよい設計の方が好ましいです。

Abustact Factroyパターンは、このような「あるオブジェクトが複数の決まったオブジェクトを持ちたい」という場合に使えます。

AbstractFactoryを使った場合

それではAbustact Factroyを使う形に変えていきましょう

ポイントとしては特定の組み合わせを生成する専用のクラスを作ることです。

以下の例の場合は以下のクラスが生成専用クラスです。

CreateWeaponSet
CreateWeaponSetType1
CreateWeaponSetType2

そしてこれらのクラスをプレイヤーに渡すことで武器を設定します。

//武器クラス
  class MainWeaponBase{・・・}
  class MainWeapon1:MainWeaponBase{・・・}
  class MainWeapon2:MainWeaponBase{・・・}
  class SubWeaponBase{・・・}
  class SubWeapon1:SubWeaponBase{・・・}
  class SubWeapon2:SubWeaponBase{・・・}
  
  //武器生成クラス
 abstract class CreateWeaponSet
 {
 	public abstract MainWeapon CreateMainWeapon();
 	public abstract SubWeapon CreateSubWeapon();
 }
 
 class CreateWeaponSetType1 : CreateWeaponSet
 {
 	 public override MainWeapon CreateMainWeapon()
 	 {
 	 	return new MainWeapon1();
 	 }
 	public override SubWeapon CreateSubWeapon()
 	{
 	 	return new SubWeapon1();
 	}
 } 
 
  class CreateWeaponSetType2 : CreateWeaponSet
  {
  	 public override MainWeapon CreateMainWeapon()
  	 {
  	 	return new MainWeapon2();
  	 }
  	public override SubWeapon CreateSubWeapon()
  	{
  	 	return new SubWeapon2();
  	}
  } 
  
  //プレイヤー
   class Player
   {
   	private MainWeapon m_main;
   	private SubWeapon m_sub;
   	
   	public void SetWeapon(CreateWeaponSet weaponSet)
   	{
   		m_main = weaponSet.CreateMainWeapon();
   		m_sub = weaponSet.CreateSubWeapon();
   	}
   }
   
   class GameFlow
    {
        Player m_player1;
        Player m_player2;
        public void Start()
        {
            m_player1.SetWeapon(new CreateWeaponSetType1());
            m_player2.SetWeapon(new CreateWeaponSetType2());
        }
    }

以上がAbstractFactoryを使った方法でした。

メイン武器とサブ武器が固定の場合はこちらの方が、バラバラに設定するより分かりやすくなったと思います。

👇この記事を読んだあなたにお勧めの書籍

コメント