如何使用通过继承Singleton模式?(How to use the Singleton patt

2019-10-16 15:31发布

我想通过我的抽象字符内的类使用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实例怎么会被丢弃,因为它是一个数据库的连接,并且只能由一个字符对象在同一时间内使用,那么一旦角色物用它做,它必须释放单一对象了对?

我试图用方法,我的性格类做这一切,但它无法正常工作。

我明白任何帮助。

Answer 1:

我感觉到了几个设计味道这里。

  • 数据库连接不应该是单身 - 正如你提到,连接来来去去,而辛格尔顿的主要观点是,它保持对应用程序的生命周期
  • 辛格尔顿和线程安全并不是一个很好的匹配
  • 游戏中的人物不应该有网关的工作(来吧,什么是战士做一个数据库?;-)

你应该更好地分离的关注,并有DB /持久性由不同类调用游戏中的人物,而不是相反的处理。

这是很难与您所提供的信息很少给予更具体的建议。



Answer 2:

辛格尔顿绝对不是好模式,当它应该只由一个对象来使用。 你为什么不创建它作为Character类的非静态字段和IDispose.Dispose摧毁它()? 如果你仍然想单身,让“PH”的保护,那么你就可以访问它GatewayAccess.ph



Answer 3:

您可以使用一个简单的static class ,而不是singletone,你不能扩展它,不能创建它的一个实例。 另外,你可以在你希望的方式使用它,通过简单地调用static它unctions,它内部可以跟踪的状态的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();
    }
}

希望这可以帮助。



文章来源: How to use the Singleton pattern via inheritance?