单身人士应该是可继承的还是不应该是?
根据Gof“当唯一的实例应该通过子类化和客户端可扩展时 应该能够在不修改代码的情况下使用扩展实例。“
但是为什么我会在MSDN
上看到Sealed和Private构造函数示例答案 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();
}
}