单身汉应该是可继承的还是不可继承的
本文关键字:可继承 单身汉 | 更新日期: 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成员进行访问。但是,该实例的确切身份可以通过子类化来扩展。