2012-04-21 41 views
1

我想通過我的抽象Charcter類使用Singleton設計模式,所以所有的子類都可以訪問對象實例。這裏是我的單例類:如何通過繼承使用Singleton模式?

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

所以我想要做的就是讓子類,即,戰士訪問網關的實例,我只是無法弄清楚如何做到這一點,因爲繼承的東西讓我感到困惑。基本上,網關訪問是一個數據庫的訪問點,一次只能有一個連接。單身模式很容易理解,它只是混合了這個和繼承。我希望一旦我達到了這個目標,我就可以以線程安全的方式進行操作。

我還想知道Singleton實例如何被刪除,因爲它是一個數據庫的連接,一次只能被一個字符對象使用,然後一旦字符對象完成了它,它就必須釋放單身對象是正確的?

我試圖在我的Character類中使用方法來完成所有這些,但它不起作用。

我感謝任何幫助。

+2

只是......不。 [單身並不酷](http:// jalf。dk/singleton /) – jalf 2012-04-21 11:24:16

回答

4

我在這裏感覺到幾種設計的氣味。

  • DB連接不應該辛格爾頓 - 正如你提到,連接來來去去,而辛格爾頓的主要觀點是,它保持對應用程序的生命週期
  • 辛格爾頓和線程安全並不是一個很好的匹配
  • 遊戲人物不應該有網關的工作(來吧,什麼是戰士做數據庫?;-)

你應該更好地分離的關注,並有DB /持久性由不同的處理這個類調用遊戲角色而不是反過來。

很難通過提供的信息給出更具體的建議。

+0

我明白你在說什麼,設計模式是一種痛苦,我花了很多時間研究單身人士以及其他模式。我會考慮你的建議,謝謝! – deucalion0 2012-04-21 11:44:44

1

你可以使用一個簡單的static class而不是singletone,你不能擴展它,也不能創建它的一個實例。此外,您可以通過簡單地調用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(); 
    } 
} 

希望這有助於。

+0

你好,你能告訴我一個如何做到這一點的例子,這聽起來像它可能是一個解決方案。謝謝 – deucalion0 2012-04-21 11:45:40

1

Singleton絕對不是好的模式,當它應該被一個對象使用時。你爲什麼不把它創建爲該Character類的非靜態字段並在IDispose.Dispose()中銷燬它?如果你仍然想單身人士,使'ph'保護,然後你可以訪問它作爲GatewayAccess.ph

+0

通過我所做的所有研究,我看到關於Singleton模式的更多負面評論。我需要在我的課程中實施它,這是我繼續用它的唯一原因,否則我不會浪費我的時間:( – deucalion0 2012-04-21 11:47:16