我试图通过我的抽象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类中使用方法来完成所有这些但是它无效。
我很感激任何帮助。
答案 0 :(得分:4)
我觉得这里有几种设计气味。
你应该更好地分离关注点,让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
进行访问