C# 如何通过继承使用单例模式?

C# 如何通过继承使用单例模式?,c#,inheritance,singleton,C#,Inheritance,Singleton,我试图通过抽象字符类使用单例设计模式,以便所有子类都可以访问对象实例。这是我的单身班: class GatewayAccess { private static GatewayAccess ph; // Constructor is 'protected' protected GatewayAccess() { } public static GatewayAccess Instance() { // Uses lazy initialization. // Note: this

我试图通过抽象字符类使用单例设计模式,以便所有子类都可以访问对象实例。这是我的单身班:

 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();
    }
所以我想做的是允许子类ie,warrior访问网关的实例,我只是不知道怎么做,因为继承的东西让我困惑。基本上,网关访问是一个数据库的访问点,一次只能有一个连接。单例模式很容易理解,它只是它和继承的混合体。我希望一旦我实现了这一点,我就可以用线程安全的方式来实现它

我还想知道如何删除Singleton实例,因为它是与数据库的连接,一次只能由一个character对象使用,那么一旦character对象使用完它,它必须释放Singleton对象,对吗

我尝试在我的角色类中使用方法来完成所有这些,但它不起作用


非常感谢您的帮助。

您可以使用一个简单的
静态类
,而不是singletone,您不能扩展它,也不能创建它的实例。另外,您可以按照自己的方式使用它,只需调用
静态
函数,它就可以在内部跟踪
私有静态连接
成员的状态

编辑

只是一个伪代码示例:


希望这有帮助。

您可以使用简单的
静态类,而不是单音类,您不能扩展它,也不能创建它的实例。另外,您可以按照自己的方式使用它,只需调用
静态
函数,它就可以在内部跟踪
私有静态连接
成员的状态

编辑

只是一个伪代码示例:


希望这有帮助。

单例模式肯定不是好模式,因为它应该只由一个对象使用。为什么不将其创建为该角色类的非静态字段,并在IDispose.Dispose()中销毁它呢?如果您仍然想要单例,请将“ph”设置为受保护,然后您可以作为网关访问来访问它。ph

单例模式绝对不是好模式,因为它应该只由一个对象使用。为什么不将其创建为该角色类的非静态字段,并在IDispose.Dispose()中销毁它呢?如果您仍然想要单例,请将“ph”设置为受保护,然后您可以将其作为网关访问。ph

我在这里感觉到一些设计气味

  • DB连接不应该是单例连接——正如您自己所提到的,连接来来往往,而单例连接的要点是它在应用程序的生命周期中一直存在
  • Singleton和线程安全性不是很好的匹配
  • 游戏角色不必使用网关(拜托,战士如何处理数据库?;-)
您应该更好地分离关注点,并让调用游戏角色的不同类处理DB/持久性,而不是相反


你提供的信息很少,很难给出更具体的建议。

我感觉到这里有几种设计的味道

  • DB连接不应该是单例连接——正如您自己所提到的,连接来来往往,而单例连接的要点是它在应用程序的生命周期中一直存在
  • Singleton和线程安全性不是很好的匹配
  • 游戏角色不必使用网关(拜托,战士如何处理数据库?;-)
您应该更好地分离关注点,并让调用游戏角色的不同类处理DB/持久性,而不是相反


你提供的信息很少,很难给出更具体的建议。

只是。。。不要。只是不要。我理解你所说的,设计模式是一种痛苦,我花了很多时间研究singleton以及其他模式。我会考虑你的建议,谢谢!我理解你所说的,设计模式是一种痛苦,我花了很多时间研究singleton以及其他模式。我会考虑你的建议,谢谢!你好,你能给我举个例子说明如何做到这一点吗?听起来这可能是一个解决方案。谢谢你好,你能给我举个例子说明怎么做吗?听起来这可能是一个解决办法。谢谢你通过我所做的所有研究,我看到更多关于单身模式的负面评论。我需要在我的课程中实施它,这是我继续学习它的唯一原因,否则我不会浪费时间:(通过我所做的所有研究,我看到更多关于单身模式的负面评论。我需要在我的课程中实施它,这是我继续学习的唯一原因,否则我不会浪费时间:(
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();
    }
}