我有一个静态类,用于访问我在整个应用程序中使用的公共属性和方法。例如,我设置了一些属性在静态类中,在应用程序运行时,我可以从属性中获取值。
但是我也可以创建一个带有单例模式的非静态类,并以相同的方式使用它。
问题:在我的情况下哪种方法是正确的?
我有一个静态类,用于访问我在整个应用程序中使用的公共属性和方法。例如,我设置了一些属性在静态类中,在应用程序运行时,我可以从属性中获取值。
但是我也可以创建一个带有单例模式的非静态类,并以相同的方式使用它。
问题:在我的情况下哪种方法是正确的?
取决于你想要实现什么。
我建议使用静态类来提供应用程序中的实用函数,并且大多数情况下避免使用单例模式。关于何时使用单例模式,请参见此问题。
如果你的类代表系统中的某种实体(例如:用户、博客文章、产品、学生等),那么它不应该是一个静态类,而应在逻辑上每次使用独立实例时进行实例化。
public sealed class Settings : IUserStettings, IOSettings
{
static readonly Settings instance = new Settings();
static Settings(){ }
Settings(){ }
public static Settings Instance
{
get { return instance; }
}
//-- interface implementation
public string UserName
{
get { throw new NotImplementedException(); }
}
// ---etc...
public string filename
{
get { throw new NotImplementedException(); }
}
//-- interface implementation
}
public interface IOSettings
{
string disk {get;}
string path { get; }
string filename { get; }
}
public interface IUserStettings
{
string UserName { get; }
string Password { get; }
}
这可以简单地使用如下:
IOSettings iosettings = Settings.Instance as IOSettings;
if(iosettings!=null){
Filereader.ReadData(IOSettings iosettings);
}
IUserSettings usersettings = Settings.Instance as IUserSettings;
if(usersettings!=null){
UserManager.Login(IUserSettings usersettings);
}
我的想法
1- 静态类用于没有实例化需求的情况,例如 .net Framework Math 类。
Math 类是中立的静态类,因为没有充分的理由去创建并维护这个类的对象。
2- 单例模式可能会与静态类概念混淆,但在单例模式中,你会得到一个完整的对象被创建到内存中。
所以最终取决于你的需求。
我认为人们倾向于在实际需要静态类但需要确保类被初始化某些值时使用单例类。但如果可以的话,两者都应该避免使用。