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