gpt4 book ai didi

具有接受参数的构造函数的 C# 单例

转载 作者:IT王子 更新时间:2023-10-29 04:34:55 25 4
gpt4 key购买 nike

我想创建一个静态类或单例类,在其构造函数中接受对另一个对象的引用。静态类已经出来了,但我想我可以创建一个在其构造函数中接受参数的单例。到目前为止,我还没有运气弄清楚或谷歌搜索语法。这可能吗?如果是这样,我该怎么做?

很抱歉在最初的帖子中没有示例,我仓促写了它。我觉得我的答案已经在回复中了,但这里有一些我想做的事情的澄清:

我想创建一个特定类型的单个实例(Singleton),但该类型的单个实例需要保存对不同对象的引用。

例如,我可能想创建一个单例“Status”类,它拥有一个 StringBuilder 对象和一个可以调用以将所述 StringBuilder 写入屏幕的 Draw() 方法。 Draw() 方法需要了解我的 GraphcisDevice 才能进行绘制。所以我想这样做:

public class Status
{
private static Status _instance;
private StringBuilder _messages;
private GraphicsDevice _gDevice;

private Status(string message, GraphicsDevice device)
{
_messages.Append(message);
_gDevice = device;
}

// The following isn't thread-safe

// This constructor part is what I'm trying to figure out
public static Status Instance // (GraphicsDevice device)
{
get
{
if (_instance == null)
{
_instance = new Status("Test Message!", device);
}
return _instance;
}
}

public void UpdateMessage
...

public void Draw()
{
// Draw my status to the screen, using _gDevice and _messages
}
}

在整个代码中,我检索了我的 Status Singleton 并调用了它的 UpdateMessage() 方法。

private Status _status = Status.Instance; // + pass reference to GraphicsDevice
_status.UpdateMessage("Foo!");

然后,在我的主类中,我还检索了单例,并绘制了它:

_status.Draw();

是的,这意味着无论我在哪里检索单例,我都需要通过传递对 GraphicsDevice 的引用来这样做,以防这是我第一次实例化单例。我可以/将使用不同的方法来检索与我的 Singleton 类中的 GraphicsDevice 一样基本的东西,例如在其他地方注册服务并在 Status 类中获取该服务。这个例子非常人为 - 我试图弄清楚是否东西首先是可能的这种模式。

最佳答案

这通常被认为是一个坏主意,因为如果你打算接受一个对象引用或一个你计划包装在类似单例的包装器中的类型参数,你不能保证你在应用域。

单例模式的重点是控制一种类型的单个实例,以便该类型只能存在一个实例。如果您允许传入一个实例,或者您制作了一个通用的单例提供程序,则您不能保证您的实例是唯一实例。

假设我有一个 SingletonFactory<T>这将允许我围绕我传递给工厂的任何类型创建一个单例。这将非常方便,并且允许我做这样的事情:

SingletonFactory<Foo>.Instance;

但是是什么阻止了我也这样做:

Foo foo = new Foo();

糟糕,看起来像Foo不再是单例,因为我可以根据需要创建尽可能多的实例。为了使单例模式起作用,您需要能够完全控制您需要限制其实例的类型。这就是为什么你不应该使用像我的 SingletonFactory<T> 这样的东西.

注意: 接受对象实例的非通用单例也是如此。我相信您可以从我之前的示例中推断出许多类似的原因,为什么接受和对象引用的单例包装器也不是一个好主意。

关于具有接受参数的构造函数的 C# 单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1122900/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com