7

在分析 Singleton 与 Static 类之间的差异时,我遇到了一点,我们可以在单例类中继承一个接口,并且可以通过接口调用单例进行多种实现。

我想要一些带有很好示例的代码演示,如何通过单例而不是静态来实现面向对象。

谢谢,

4

3 回答 3

4

虽然很难说出您到底指的是什么,但您可能指的是Multiton 模式,您可以在其中将命名实例的映射作为键值对进行管理。

这基本上是一个工厂,但每个实例只创建一次:

我对Wikipedia 示例进行了一些修改,以表明您甚至可以从单例类派生,只要您的具体实现是私有的并且在原始类中:

class FooMultiton
{
    private static readonly Dictionary<object, FooMultiton> _instances =
        new Dictionary<object, FooMultiton>();

    // this is the classic good old singleton trick (prevent direct instantiation)
    private FooMultiton()
    { }

    // you can also have private concrete implementations, 
    // invisible to the outside world
    private class ConcreteFooMultitonOne : FooMultiton
    { }

    public static FooMultiton GetInstance(object key)
    {
        lock (_instances) 
        {   
            FooMultiton instance;

            // if it doesn't exist, create it and store it
            if (!_instances.TryGetValue(key, out instance))
            {
                // at this point, you can create a derived class instance
                instance = new ConcreteFooMultitonOne();
                _instances.Add(key, instance);
            }

            // always return the same ("singleton") instance for this key
            return instance;
        }
    }
}

此外,一般来说,如果单例不是静态类,它可以实现您想要的任何接口。单例模式唯一阻止的是单例类的多个实例的实例化,但这并不意味着您不能用其他东西完全替换实现。

例如,如果您有一个不是静态类的单例:

interface ICanTalk
{
    string Talk();
}

class Singleton : ICanTalk
{
    private Singleton() { }

    private static readonly Singleton _instance = new Singleton();
    public static Singleton Instance
    { get { return _instance; } }

    public string Talk()
    { return "this is a singleton"; }
}

您还可以有许多不同的实现:

class OtherInstance : ICanTalk
{
    public string Talk()
    { return "this is something else"; }
}

然后你可以自由选择你想要的任何实现,但只得到一个Singleton类的实例:

ICanTalk item;

item = Singleton.Instance;
item = new OtherInstance();
item = new YetAnotherInstance();
于 2013-08-28T13:03:28.067 回答
3

根据nkr1pr

每个类都可以实现一个接口,而 Singleton 只是一个“普通”类,它确保除了它可能实现的其他业务逻辑之外,在任何时间点都只存在一个实例。这也意味着 Singleton 至少有 2 个职责,这不是好的 OO 设计,因为类应该只有 1 个职责并确保它们擅长该职责,但这是另一个讨论。

就像是:

public interface MyInterface 
{
}

public class MySingleton:MyInterface
{
  private static MyInterface instance = new MySingleton();

  private MySingleton() 
  {
  } 

  public static MyInterface getInstance()
  {
    return instance;
  }
}
于 2013-08-28T12:59:40.090 回答
1

我不确定你在问什么,但是单例类可以实现接口。单例类并不意味着静态类,创建单例实例的方法之一就是利用静态成员。

public class MyInterfaceImplementation : IMyInterface
{

    private static MyInterfaceImplementation instance;
    private static readonly object lockObj = new object();

    private MyInterfaceImplementation() { }  //private .ctor

    public static MyInterfaceImplementation Instance
    {
        get
        {
            if (instance == null)
            {
                lock (lockObj)
                {
                    instance = new MyInterfaceImplementation();
                }
            }
            return instance;
        }
    }

    public void MyInterfaceMethod()
    {
        //Implement here
    }
}
于 2013-08-28T13:03:53.087 回答