单身人士应该是可继承的吗?

时间:2012-02-01 17:39:22

标签: c# design-patterns inheritance singleton

单身人士应该是可继承的还是不应该是?

根据Gof“当唯一的实例应该通过子类化和客户端可扩展时 应该能够在不修改代码的情况下使用扩展实例。“

但是为什么我会在MSDN

上看到Sealed和Private构造函数示例

2 个答案:

答案 0 :(得分:1)

我认为你在这里混合了两件不同的东西。单例模式需要所有调用者使用的单个实例。继承只意味着我可以在类层次结构之间共享通用逻辑。我觉得这是单例模式的实现: (为了示例的缘故,忽略缺少锁定/线程安全性)

public class Singleton
{
    private static Singleton _instance;
    public static Singleton Instance
    {
         get 
         { 
            if (_instance == null)
            {
                 // This is the original code.
                 //_instance = new Singleton();

                 // This is newer code, after I extended Singleton with
                 // a better implementation.
                 _instance = new BetterSingleton();
            }
            return _instance;
         }
    }

    public virtual void ActualMethod() { // whatever }
}

public class BetterSingleton : Singleton
{
    public override void ActualMethod() { // newer implementation }
}

我们仍然有一个单例,可以通过Singleton类的静态实例成员访问。但是该实例的确切身份可以通过子类化来扩展。

答案 1 :(得分:1)

在我的项目中,我使用了Mark Seemanns的书中的依赖注入的环境上下文实现。该模式的主要用途是,当您要求Current实例时,必须有一些东西,并且Context也可以通过其他实现进行切换。 F.E。

public class TimeContext
{
    private static TimeContext _instance;

    public static TimeContext Current
    {
        get
        {
            if (_instance == null)
            {
                _instance = new DefaultContext();
            }
            return _instance;
        }
        set
        {
            if (value != null)
            {
                _instance = value;
            }
        }
    }
    public abstract DateTime GetDateTime();
}

上下文的具体实现应该是:

public class DefaultContext : TimeContext
{
    public DateTime GetDateTime()
    {
        return DateTime.Now();
    }

}