1

すべてのサブクラスがオブジェクトインスタンスにアクセスできるように、抽象文字クラスを介してシングルトンデザインパターンを使用しようとしています。ここに私のシングルトンクラスがあります:

 class GatewayAccess

{
private static GatewayAccess ph;

// Constructor is 'protected'
protected GatewayAccess()
{
}

public static GatewayAccess Instance()
{
  // Uses lazy initialization.
  // Note: this is not thread safe.
  if (ph == null)
  {
      ph = new GatewayAccess();
      Console.WriteLine("This is the instance");
  }

  return ph;
}
}

これを私の program.cs で使用して、問題なくインスタンスを作成できます。

static void Main(string[] args)
    {
        GameEngine multiplayer = new GameEngine(5);

        Character Thor = new Warrior();
        Thor.Name = "Raymond";
        Thor.Display();
        Thor.PerformFight();
        Thor.PerformFight();
        multiplayer.Attach(Thor);

        GatewayAccess s1 = GatewayAccess.Instance();
        GatewayAccess s2 = GatewayAccess.Instance();

        if (s1 == s2)
        {
            Console.WriteLine("They are the same");
        }

        Console.WriteLine(Thor.getGamestate());

        Console.ReadLine();
    }

だから私がしたいのは、サブクラス、つまり戦士がゲートウェイのインスタンスにアクセスできるようにすることです。継承が混乱しているため、これを行う方法がわかりません。基本的に、ゲートウェイ アクセスは、一度に 1 つの接続のみを持つことができるデータベースへのアクセス ポイントです。シングルトン パターンは理解するのに十分簡単で、それと継承を組み合わせただけです。これを達成したら、スレッドセーフな方法で実行できることを望んでいました。

また、Singleton インスタンスはデータベースへの接続であり、一度に 1 つの文字オブジェクトでしか使用できないため、Singleton インスタンスを削除する方法についても考えていました。右?

Character クラスのメソッドを使用してこれらすべてを実行しようとしましたが、うまくいきません。

これについて何か助けていただければ幸いです。

4

3 に答える 3

4

ここでいくつかのデザインの匂いを感じます。

  • DB接続はシングルトンであってはなりません-ご存知のように、接続は行き来しますが、シングルトンの主なポイントは、アプリの存続期間中は維持されることです
  • シングルトンとスレッドセーフはよく一致していません
  • ゲームのキャラクターはゲートウェイを操作する必要はありません(さあ、データベースを使って戦士は何をしますか?;-)

関心の分離を適切に行い、DB /永続性を、ゲームのキャラクターを呼び出す別のクラスで処理する必要があります。その逆ではありません。

あなたが提供したわずかな情報でより具体的なアドバイスを与えることは困難です。

于 2012-04-21T11:39:06.157 に答える
1

シングルトンは、1つのオブジェクトのみで使用されることになっている場合、間違いなく適切なパターンではありません。そのCharacterクラスの非静的フィールドとして作成し、IDispose.Dispose()で破棄してみませんか?それでもシングルトンが必要な場合は、「ph」を保護してから、GatewayAccess.phとしてアクセスできます。

于 2012-04-21T11:37:52.733 に答える
1

シングルトーンの代わりに単純な を使用できますstatic class。拡張することも、インスタンスを作成することもできません。さらに、関数を呼び出すだけで好きなように使用でき、内部でメンバーstaticの状態を追跡できます。private static connection

編集

擬似コードの:

public static class Connector
{
    static SqlConnection con = new SqlConnection(...); //return type object, 
                                                       //just for example, choose more 
                                                       //appropriate type for you.

    public static object GetData(string query)
    {
       con.Open();

       //run query and retrieve results

       con.Close();
    }
}

お役に立てれば。

于 2012-04-21T11:33:16.987 に答える