2012-04-21 8 views
1

抽象的なCharcterクラスを使用してシングルトンデザインパターンを使用しようとしているので、すべてのサブクラスがオブジェクトインスタンスにアクセスできます。ここに私のシングルトンクラスは次のとおりです。継承を介してシングルトンパターンを使用するには?

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つの接続しか持つことのできないデータベースへのアクセスポイントです。シングルトンのパターンは理解するのが簡単で、そのことと継承のちょうど混合です。私はこれを達成したら、スレッドセーフな方法でそれをやり遂げることができたと思っていました。

また、データベースへの接続であり、一度に1つの文字オブジェクトでしか使用できないため、Singletonインスタンスが削除される可能性があります。シングルトンのオブジェクトが正しく表示されますか?

私はすべてこれを行うには、私の文字クラスのメソッドを使用しようとしましたが、それは動作しません。

私はこれに助けていただきありがとうございます。

+2

ちょうど...しないでください。 [シングルトンはクールではありません](http:// jalf。dk/singleton /) – jalf

答えて

4

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

  • DB接続はシングルトンであるべきではない - あなた自身が言及として、シングルトンの主なポイントは、それがシングルトンとスレッドの安全性は良い試合
  • ではありません、アプリケーションの寿命
  • のためにとどまることである間の接続は、行ったり来たり
  • ゲームの文字がゲートウェイで動作する必要はありません(おいおい、何がデータベースを行うには戦士のですか?;-)

あなたはより良い別の懸念とは異なるが取り扱うDB /永続性を持つべきですクラスの代わりにゲームの文字を呼び出すクラスです。

あなたが提供した小さな情報で、より具体的なアドバイスをするのは難しいです。

+0

私はあなたが言っていることを理解している、デザインパターンは痛みです、シングルトンだけでなく、他のパターンを研究する時間。私はあなたの提案を検討します、ありがとう! – deucalion0

1

代わりsingletoneの、あなたはそれを拡張することはできませんし、そのインスタンスを作成することはできません、簡単なstatic classを使用することができます。さらに、staticを呼び出すだけで、あなたが望むように使用することができ、内部でprivate static connectionのメンバーの状態を追跡することができます。ただ、擬似コード

EDIT

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(); 
    } 
} 

は、この情報がお役に立てば幸いです。

+0

こんにちは、私はこれを行う方法の例を示すことができます、それは解決策かもしれないように聞こえます。ありがとうございました – deucalion0

1

シングルトンは、1つのオブジェクトだけが使用するはずのパターンではありません。なぜそれをCharacterクラスの非静的フィールドとして作成し、それをIDispose.Dispose()で破棄しないのですか?まだシングルトンが必要な場合は、 'ph'を保護してからGatewayAccess.phとしてアクセスできます。

+0

私がやったすべての研究を通して、私はシングルトンパターンに関して何よりも否定的なコメントを見ます。私は私の授業でそれを実装する必要があります、それは私がそれを続けている唯一の理由です、そうでなければ私は自分の時間を無駄にしません:( – deucalion0

関連する問題