【问题标题】:How to implement singleton from one project to another project如何实现从一个项目到另一个项目的单例
【发布时间】:2011-02-27 15:06:36
【问题描述】:

我正在开发 Windows 窗体应用程序。我需要实现单例设计模式。在同一个包中的两个类中实现单例时,它可以正常工作,但只需为该类中的两个类创建对象,就可以在不同的包中实现这两个类。我该如何实施?这是代码:

public class Singleton
{
   private static Singleton instance;
   B b=new B();
   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }

public void a()
{
}
b.c();
}


public class B
{
SingleTon single=new SingleTon.Instance;
single.a()
public void c()
{
}
}

【问题讨论】:

  • “不工作”不足以解释你在那里做什么。
  • 请注意您在 B 类中使用 SingleTon,而实际上它的名称是 Singleton。 c# 中的名称区分大小写。
  • 显示的代码远未编译...
  • 您可以使用private static readonly Singleton instance = new Singleton();(静态字段在第一次使用时在.NET中初始化)这样您就不需要在属性的getter中检查instance是否为null。

标签: c# singleton


【解决方案1】:

首先,如果您要在项目之外公开它,请考虑使用抽象工厂模式而不是单例模式。请参阅我的own question,了解为什么这会失控。

但是,如果必须,从小处着手:

public class Singleton
{
    private static Singleton instance = new Singleton();
    private Singleton() { }
    public static Singleton Instance { get { return instance; } }
    public void a(B b)
    {
        b.c();
    }
}

public class B
{
    static void Main()
    {
        B b = new B();
        Singleton.Instance.a(b);
    }

    public void c()
    {
        // whatever you want it to do
    }
}

但是,应该预先警告您,这会在 Singleton 和 B 之间造成非常紧密的耦合(几乎是死锁),这意味着您(作为库创建者)必须了解将使用它的每个 B 类。在这里考虑一个非常不同的设计,因为这是实现 Singleton 的可怕方式。我几乎不想发布这段代码,但我这样做是为了发布这个免责声明。

【讨论】:

    【解决方案2】:

    单例模式的思想是使用同一个对象而不是创建一个新对象。除了代码 sn-p 中的所有语法错误之外,您不应该尝试创建“新”单例。相反,在 B 类中,您应该有这样的一行: private Singleton singleton = Singleton.Instance; 按照你写的方式,它不会编译,因为 Singleton 的构造函数在 B 类中不可见。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-15
      • 1970-01-01
      • 2012-12-25
      • 2018-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多