单身汉应该是可继承的还是不可继承的

本文关键字:可继承 单身汉 | 更新日期: 2023-09-27 18:22:13


Singleton应该是可继承的,还是它们不应该是?

根据Gof";当唯一的实例应该通过子类化进行扩展时,以及客户端应该能够在不修改代码的情况下使用扩展实例"

但是为什么我在MSDN 上看到Sealed和Private构造函数的示例

在我的项目中,我使用了Mark Seemanns在.NET中的Dependency Injection一书中的环境上下文实现。该模式的主要用途是,当你请求Current实例时,必须有一些东西,而且上下文可以由其他实现切换。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();
    }
}

单身汉应该是可继承的还是不可继承的

我认为您在这里混合了两种不同的东西。singleton模式调用由所有调用方使用的单个实例。继承只是意味着我可以在类层次结构之间共享公共逻辑。我觉得这是singleton模式的一个实现:(为了示例起见,忽略缺少锁定/线程安全性)

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,通过singleton类的静态Instance成员进行访问。但是,该实例的确切身份可以通过子类化来扩展。