我有一个静态类,用于访问我的公共属性(整个应用程序的全局)和我在应用程序运行期间使用的方法。例如,我在静态类中设置了一些属性,在app运行时我可以从属性中获取值。
但是我可以用单例模式创建非静态类并以相同的方式使用它。
问题:在我的案例中哪种方法是正确的?
答案 0 :(得分:3)
取决于你想要达到的目标。
我会在你的应用程序中使用静态类来提供实用程序功能,并且大多数情况下都避免使用单例。有关何时使用单身人士的信息,请参阅this question。
如果你的类代表系统中的某种实体(例如:用户,博客文章,产品,学生等),它不应该是静态类,而是每次逻辑使用时都要实例化单独的实例。
答案 1 :(得分:3)
下面的示例显示您可以使用具有单例类的接口(使用静态类是不可能的。)
我更喜欢这种模式在静态方法/属性的大量列表或几个静态类之上。
这些接口可以提供特定于主题的设置,这些设置甚至可以用作其他方法或类的参数,只要合同得到尊重,这些类就不需要知道设置的来源。
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);
}
答案 2 :(得分:1)
我的想法
1-如果没有理由在.net Framework Math Class中有实例,则使用静态类。
Math类是静态的,因为没有充分的理由拥有这个类的对象然后维护该对象。
2- Singleton模式可能与静态类概念混淆,但在单例模式中,您可以获得在内存中创建的整个对象。
所以它最终取决于你的要求。
答案 3 :(得分:1)
从OO /可测试性的角度来看,这两者都不是特别好的解决方案。在SO中搜索singleton以查看参数。也就是说,如果您需要/想要编写像Math
那样的过程代码,请不要使用静态仅用于状态答案 4 :(得分:0)
我认为人们倾向于在实际需要静态类时使用单例类,但需要确保该类是以某个值启动的。但是如果可以的话,他们真的应该避免。