Pau*_*Jan 3 c# design-patterns
作为练习,我正在将我们庞大而且经过强化的Delphi框架的一部分翻译成C#.
此框架中包含一个通用的单例父类.当然,在C#中实现单例是相当容易的(甚至还有Jon Skeet文章,所以我还希望如此),但是我们的Delphi单例对模式的看法略有不同:与发布'实例'相反property/method,它有一个"伪"构造函数,它总是返回相同的实例.这种方法的本质特征是单例类的用户不知道他正在处理单例:他们知道,他们只是构造任何旧类并从中请求一些信息.
我想在C#中完成同样的事情(作为练习,所以它不一定是生产质量的代码,邪恶的hackery很好),但到目前为止,我已经失败了.
任何建议简单myInstance = new MyClass();总是返回相同的实例是最受欢迎的!
我们正在谈论框架提供的单例模式的便利实现.它不一定必须是父类,但它也必须帮助开发人员创建自己的单例.要求他们手动将所有方法调用重定向到单实例,不会让他们满心欢喜.:-)
我真的没有兴趣辩论这是否是处理单身人士的正确方法,因为现在我只对c#-tweaking的精细艺术感兴趣.
你会做一个代理(编辑:正如汤姆在下面指出的,正确的设计模式是Monostate):
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
....
public static void Main() {
var my1 = new MyClass();
var my2 = new MyClass();
}
Run Code Online (Sandbox Code Playgroud)
my1!= my2但my1.DoStuff()调用与my2.DoStuff()相同的方法实例如果只编程了一个接口,这将进一步简化.
编辑:通过使_actual保护内部并覆盖MyClass.Equals(对象obj)以检查this._actual == obj._actual,可以部分解决相等问题