单例属性

14

好的,如果我创建一个单例类并通过公共静态属性公开单例对象...我理解这一点。

但是我的单例类中还有其他属性。 那些应该是静态的吗? 这些也应该是私有的吗?

我只想通过以下方式访问我的单例类的所有属性:

MySingletonClass.SingletonProperty.SomeProperty2

SingletonProperty 返回单例实例。我猜我的问题是,如何暴露单例类中的其他属性...将它们设置为私有,然后通过公共单例静态属性访问它们?

或者说,一个单例的所有其他属性和方法都应该是公共的非静态的吗?

6个回答

27

一旦获取到SingletonProperty(即对象的单个实例),之后任何操作都可以像创建可实例化的类一样实现,因为Singleton实际上是一个常规对象的单个实例。

例如,下面的Singleton(显然不是最好的Singleton设计,但请容忍我)提供了两个名为Value和Name的公共属性:

public class MySingleton
{
    private static MySingleton _instance;    

    private MySingleton() { }

    public static MySingleton Instance
    {
        get
        {
            if(_instance == null)
                _instance = new MySingleton();

            return _instance;
        }
    }

    // Your properties can then be whatever you want
    public string Value { get; set; }

    public string Name { get; set; }
}

访问这些属性的方式如下:

MySingleton.Instance.Name = "StackOverflow";

MySingleton.Instance.Value = "Rocks!";

注意。虽然其他所有内容都是公共的,但唯一访问它们的方式是通过公开单例实例的任何属性。谢谢。 - PositiveGuy
6
对Name和Value属性的读写不是线程安全的;不幸的是,你需要在每个属性上使用锁对象。 - The Light
我不知道这是如何被选为正确答案的?或者,Skeet 没有看到它。如果 MySingleton 不是静态的,你怎么访问 MySingleton.Instance - DarthVader
@DarthVader - 很好的发现...即使经过了这么长时间。 - Justin Niessner
单例模式经过这么长时间终于改变了 :) - DarthVader
双重检查锁定怎么样?https://dev59.com/O2025IYBdhLWcg3whWhm http://csharpindepth.com/Articles/General/Singleton.aspx - Kiquenet

3

将它们作为任何其他类的公共属性。使用单例模式与此无关。


2
只要它们不是静态的,您需要一个对象实例来访问属性。如果创建对象实例的唯一方法是通过单例模式,那么您的类属性就是单个类实例的固有部分。没有特殊要求。

2
不,让它们公开。由于该类只能有一个实例,因此访问这些属性的唯一方式是通过单个实例。

1

它们应该是非静态的公共属性。

可以这样想。您只需要一个此类的实例 - 但仍是一个实例。

因此,将构造函数设置为私有,并创建一个静态属性来处理延迟实例化。

所有其他属性、成员和方法都应该是实例的一部分 - 您现在已确保了这个实例将是唯一的。


0

你的MySingletonClass.SingletonProperty返回一个单例类的实例引用。因此,你可以像使用其他类的实例一样使用公共属性(方法等)。

MySingletonClass.SingletonProperty.SomeProperty2

当你将SomeProperty2设为静态时,你可以做以下操作(但这不符合单例设计模式的精神):
MySingletonClass.SomeProperty2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接