好吧,如果我创建一个单例类并通过公共静态属性公开单例对象......我明白了。
但是我的单例类还有其他属性。 这些应该是静态的吗? 这些也应该是私人的吗?
我只想通过这样做能够访问我的单例类的所有属性:
MySingletonClass.SingletonProperty.SomeProperty2
SingletonProperty 返回单个单例实例。 我想我的问题是,如何公开单例类中的其他属性..将它们设为私有,然后通过公共单例静态属性访问它们?
或者单例的所有其他属性和方法都应该是公共非静态的吗?
一旦获得
SingletonProperty
(这是对象的单个实例),之后的任何内容都可以像创建要实例化的类一样实现,因为单例实际上是常规对象的单个实例。
例如,下面的 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!";
像对待任何其他类一样将它们设为公共属性。使用单例模式与此无关。
不,让它们公开。由于该类只能有一个实例,因此访问这些属性的唯一方法是通过单个实例。
只要它们不是静态的,您就需要一个对象实例来访问该属性。如果创建对象实例的唯一方法是通过单例模式,那么类属性本质上是单个类实例的一部分。没有什么特别需要的。
它们应该是非静态公共属性。
这样想。你是这个类的一个实例 - 但仍然是一个实例。
因此,您将构造函数设为私有,并创建一个处理延迟实例化的静态属性。
所有其他属性、成员和方法都应该是实例的一部分 - 您现在确保的实例将是唯一的。
您的
MySingletonClass.SingletonProperty
返回对Singleton类的实例的引用。因此,您可以像使用类的任何其他实例一样使用公共属性(和方法等)。
MySingletonClass.SingletonProperty.SomeProperty2
当您将
SomeProperty2
设为静态时,您可以执行以下操作(但这不符合单例设计模式的精神):
MySingletonClass.SomeProperty2
在较新版本的 C# 中,你可以这样写:
private static MyObject _instance;
public static MyObject Instance
{
get => _instance ??= new();
}
基本上,您可以为
_instance
if 分配一个值,并且您将返回 _instance ,它要么已经有一个值,要么刚刚被分配了一个新值。更干净