如何通过继承使用Singleton模式?

时间:2012-04-21 11:23:06

标签: c# inheritance singleton

我试图通过我的抽象Charcter类使用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();
    }

所以我想要做的是允许子类,即warrior访问Gateway的实例,我只是无法弄清楚如何做到这一点,因为继承的东西让我感到困惑。基本上,网关访问是数据库的访问点,一次只能有一个连接。单例模式很容易理解,它只是它和继承的混合。我希望一旦我实现了这一点,我就能以线程安全的方式做到这一点。

我还想知道如何删除Singleton实例,因为它是一个数据库连接,一次只能由一个字符对象使用,然后一旦字符对象完成,它必须释放单身对象向上?

我尝试在我的Character类中使用方法来完成所有这些但是它无效。

我很感激任何帮助。

3 个答案:

答案 0 :(得分:4)

我觉得这里有几种设计气味。

  • 数据库连接不应该是Singleton - 正如你自己提到的,连接来来去去,而Singleton的主要观点是它可以保持应用程序的生命周期
  • 单身和线程安全不是一个很好的匹配
  • 游戏角色不应该与网关一起工作(来吧,什么是数据库的战士?;-)

你应该更好地分离关注点,让DB /持久性由一个不同的类来处理,这个类调用游戏角色而不是相反。

使用您提供的少量信息很难提供更具体的建议。

答案 1 :(得分: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();
    }
}

希望这有帮助。

答案 2 :(得分:1)

Singleton绝对不是好的模式,它应该只被一个对象使用。为什么不将它创建为该Character类的非静态字段并在IDispose.Dispose()中将其销毁?如果您仍然想要单身,请将'ph'保护,然后您可以将其作为GatewayAccess.ph

进行访问