C# 通过实现接口创建单例类有什么好处?
如果我有下面这样的界面C# 通过实现接口创建单例类有什么好处?,c#,C#,如果我有下面这样的界面 public interface IMethods { void M1(); void M2(); } 然后我想通过继承上面的接口来创建一个单例类,那么重复使用单例类的好处是什么?我不完全确定你在问什么,但是如果你问“作为单例实现这个接口有什么好处”,答案是单例总是提供的相同好处:“一个实例的保证,无论它使用了多少个位置”。Singleton的存在是为了强制一个具有实例访问权限的类的单个实例,而不是静态类和方法/属性。示例实现: public
public interface IMethods
{
void M1();
void M2();
}
然后我想通过继承上面的接口来创建一个单例类,那么重复使用单例类的好处是什么?我不完全确定你在问什么,但是如果你问“作为单例实现这个接口有什么好处”,答案是单例总是提供的相同好处:“一个实例的保证,无论它使用了多少个位置”。Singleton的存在是为了强制一个具有实例访问权限的类的单个实例,而不是静态类和方法/属性。示例实现:
public class Methods : IMethods
{
// Singleton instance
private static readonly IMethods _instance = new Methods();
// Private constructor to enforce singleton
private Methods()
{
}
// The instance getter
public static IMethods Instance
{
get
{
return _instance;
}
}
public void M1()
{
}
public void M2()
{
}
}
这里要告诉您的是,Instance
属性未在IMethods
接口上公开,因此获取它需要实例类型为Methods
而不是IMethods
,这有点违背了继承接口的目的
通常,人们使用依赖注入框架将接口实现的生命周期设置为singleton(也称为共享实例)。它更“面向对象友好”。我不完全确定你在问什么,但如果你问“作为singleton实现此接口有什么好处?”答案和singleton提供的好处是一样的:“一个实例的保证,不管它被使用了多少个地方”。Singleton的存在是为了通过实例访问而不是静态类和方法/属性来强制类的单个实例。一个示例实现:
public class Methods : IMethods
{
// Singleton instance
private static readonly IMethods _instance = new Methods();
// Private constructor to enforce singleton
private Methods()
{
}
// The instance getter
public static IMethods Instance
{
get
{
return _instance;
}
}
public void M1()
{
}
public void M2()
{
}
}
这里要告诉您的是,Instance
属性未在IMethods
接口上公开,因此获取它需要实例类型为Methods
而不是IMethods
,这有点违背了继承接口的目的
通常,人们使用依赖注入框架将接口实现的生命周期设置为singleton AKA共享实例。它更“面向对象友好”。单例方面只是
IMethods
契约的一个实现,假设您需要单例模式,那么它将为您带来好处
通过接口公开该单例的好处是,消费者不需要关心它是如何实现的,只需要它是如何实现的,并且他们可以使用它。在以后的某个日期,如果您突然需要一个常规实例而不是单例实例,您可以在不影响消费者的情况下更改它
这种情况在DI容器中非常常见,您通常可以将绑定的生命周期配置为在单例范围内
如果您直接使用单例,而从未真正使用过接口,那么接口中就没有什么用处了。如果使用单例时不需要将其约束到单个实例,那么采用单例模式就没有什么用处。单例方面只是
IMethods
契约的一个实现,假设您需要单例模式,那么它将为您带来好处
通过接口公开该单例的好处是,消费者不需要关心它是如何实现的,只需要它是如何实现的,并且他们可以使用它。在以后的某个日期,如果您突然需要一个常规实例而不是单例实例,您可以在不影响消费者的情况下更改它
这种情况在DI容器中非常常见,您通常可以将绑定的生命周期配置为在单例范围内
如果您直接使用单例,而从未真正使用过接口,那么接口中就没有什么用处了。如果使用单例时不需要将其约束到单个实例,那么采用单例模式就没有什么用处。请发布一些实时场景的示例代码好吗?没有必要,这将是一个标准的单例实现,碰巧也实现了您的接口。额外的位将使用DI容器或工厂模式返回
IMethods
。请发布一些示例代码实时场景好吗?不需要,这将是一个标准的单例实现,碰巧也实现了您的接口。额外的位将使用DI容器或工厂模式返回IMethods
。对实例
属性的访问可以隐藏在MethodsFactory
后面,后者知道单例,但返回IMethods
。正如您所说,大多数DI容器通常都会免费提供这些内容。Good point@adamhuldsworth并没有考虑到这一点。不过,它比DI框架更紧密地耦合。与DI框架相比,您要么耦合到MethodsFactory
,要么耦合到Ninjectkernel.Get()
。所有的东西都可以被平等地抽象,DI只是免费给你额外的东西,而不是穷人的方法。这是真的。我想这取决于你是否正确应用IoC。好吧,正确应用IoC与使用框架无关,因此,我仍然支持这样的评论,即使用框架不会给您带来比您自己更大的松散耦合。对实例
属性的访问可以隐藏在方法工厂
后面,该工厂知道单例,但返回I方法
。正如您所说,大多数DI容器通常都会免费提供这些内容。Good point@adamhuldsworth并没有考虑到这一点。不过,它比DI框架更紧密地耦合。与DI框架相比,您要么耦合到MethodsFactory
,要么耦合到Ninjectkernel.Get()
。所有的东西都可以被平等地抽象,DI只是免费给你额外的东西,而不是穷人的方法。这是真的。我想这取决于你是否正确地应用了IoC。好吧,正确地应用IoC与使用框架无关,所以我仍然坚持