gpt4 book ai didi

c# - 具有公共(public)(单实例)构造函数的单例

转载 作者:行者123 更新时间:2023-11-30 13:25:15 25 4
gpt4 key购买 nike

作为一项练习,我将我们久经考验的大型 Delphi 框架的一部分转换为 C#。

此框架中包含一个通用单例父类。当然,在 C# 中实现单例相当容易(甚至有一篇 Jon Skeet 文章,所以我还希望得到更多),但是我们的 Delphi 单例对该模式的看法略有不同:与发布“实例”相反属性/方法,它有一个总是返回相同实例的“假”构造函数。这种方法的本质特征是单例类的用户不知道他正在处理一个单例:据他们所知,他们只是构造任何旧类并从中请求一些信息。

我想在 C# 中完成同样的事情(作为练习,所以它不必是生产质量代码,邪恶的 hackery 没问题),但到目前为止我都失败了。

任何使简单的 myInstance = new MyClass(); 始终返回相同实例的建议都非常受欢迎!


附加信息

  • 我们正在讨论框架提供的单例模式的便捷实现。它不一定必须是父类,但它也必须帮助开发人员创建他们自己的单例。要求他们手动将所有方法调用重定向到单个实例不会让他们高兴得要溢出来。 :-)

  • 我对争论这是否是处理单例的正确方法并不感兴趣,现在我只对 c# 调整的更精细的艺术感兴趣。

最佳答案

你会做一个代理(编辑:正如汤姆在下面指出的那样,正确的设计模式是单态):

public class MyClass {
MyActualClass _actual;
public MyClass() {
_actual = MyActualClass. Instance;
}
public DoStuff() {
_actual.DoStuff();
}
}

internal class MyActualClass {
private MyActualClass {
}
public DoStuff() {
...
}
MyActualClass _instance;
public static Instance {
get {
if(_instance == null)
_instance = new MyActualClass()
return _instance;
}
}
}

....

public static void Main() {
var my1 = new MyClass();
var my2 = new MyClass();
}

my1 != my2 但 my1.DoStuff() 调用与 my2.DoStuff() 相同的方法实例如果您仅对接口(interface)进行编程,这将进一步简化。

编辑:通过使_actual protected internal 并覆盖 MyClass.Equals(object obj) 检查是否 this._actual == obj._actual 可以部分解决相等性问题

关于c# - 具有公共(public)(单实例)构造函数的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/384610/

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