当前位置:  开发笔记 > 编程语言 > 正文

具有公共(单实例)构造函数的单例

如何解决《具有公共(单实例)构造函数的单例》经验,为你挑选了1个好方法。

作为练习,我正在将我们庞大而且经过强化的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,可以部分解决相等问题



1> George Mauer..:

你会做一个代理(编辑:正如汤姆在下面指出的,正确的设计模式是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,可以部分解决相等问题

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有