单例模式 - 默认属性

时间:2014-07-08 05:28:08

标签: c# design-patterns visual-studio-2013

我一直在研究Singleton模式,因为它在Settings类中使用。这是我的项目AccessTest的Settings.Designer.cs中的相关代码:

internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase
{        
    private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));

    public static Settings Default
    {
        get
        {
            return defaultInstance;
        }
    }

    public string applicationSetting1
    {
        get
        {
            return ((string)(this["applicationSetting1"]));
        }
    }
}

我不清楚的是为什么属性' applicationSetting1'通过另一个属性访问'默认'像这样:

var value = AccessTest.Properties.Settings.Default.applicationSetting1;

我正在运行VS2013 C#和4.5。

3 个答案:

答案 0 :(得分:5)

因为defaultInstance是静态的,而applicationSetting1则不是。这有效地使defaultInstance成为类实例的 manager 。当你在类上调用静态方法时,它不需要实例化,所以你知道你只能维护一个类的实例。

回应您的意见:

Default不是applicationSetting1的; Default只是一个返回applicationSetting1实例的全局函数。在单例模式的情况下,总是碰巧是相同的实例。

经理是我的用语。为了更好地描述单例模式是什么,可以将其视为具有单个访问器的全局变量(我将其描述为管理器,只是因为它管理变量的生命周期)。

答案 1 :(得分:1)

Normaly,您的Default属性称为Instance

这样你就可以这样打电话给你的单身人士了:

Settings.Instance. X FUNCTION()

Erich Gamma的设计模式在设计模式上非常扎实。您应该可以在网上轻松找到PDF:)

顺便说一下,你还应该将它添加到你的默认/实例属性

If(defaultInstance == null)
{
  defaultInstance = new Settings();
}
return defaultInstance

这样你的单身人士永远不会是空的,并且是懒惰的实例化

答案 2 :(得分:1)

单身人士模式上有很多帖子,但我找不到解决这个问题的任何帖子。所以我想我自己使用这个在我的秘密实验室里借助你的帖子创建的例子来解释它:

namespace MyProject.Properties                                  
{                                   
    internal class Singleton                                
    {                               

        // Create an instance of the class itself.                          
        private static Singleton instance = new Singleton();                            

        // Wrap the instance in a public property.                          
        public static Singleton Instance                            
        {                           
            get {return instance;}                      
        }                           

        // Prevent additional references from being created with a private constructor.                         
        private Singleton() { }                         

        // Create a non-static variable.                                
        public string nonStatic = "non static";                         

    }                               
}                                   

我们对此Singleton类了解以下内容:

  • '实例'公共财产只能静态访问。
  • '非静态'无法静态访问,即它只能是 通过参考访问。
  • 私有构造函数阻止了其他内容 来自被创造的参考。

那么,如何才能访问非静态的'来自课外?

该框架通过赋予静态“实例”来解决困境。具有仅存在于单身情境中的魔力:'实例'成为一个桥梁"提供对任何非静态的访问。因此,这种形式有效:

var value = MyProject.Properties.Singleton.Instance.nonStatic;                                  

注意:在Settings.Designer.cs文件中使用我的Microsoft模式似乎不是真正的单例,因为默认构造函数允许创建其他引用。